2013-02-07 105 views
0

我试图通过串行端口连接读取信息。我试图使用超级终端发送字符或字符串到我的程序。代码生成良好,并将调试,直到它到达我正在使用的ReadFile函数。一旦启动该功能,它就会等待发送信息。一旦我输入4个字符,我就会收到标题中说明的未处理的异常。断点使我在AfxWinMain和hPrevInstance中无法评估CXX0030表达式。我可以使用我的程序将数据发送到超级终端,但无论出于何种原因它都会与readfile崩溃。0x76b1dd74未处理的异常。访问冲突写入位置0x00000000

凡功能被称为

void CThermotronDlg::OnBnClickedDelete() 
{ 
Serial Port; 
CString Temp("34"); 
bool ans; 
int nItem = MyListEx.GetSelectionMark(); 



ans = Port.ReadPort(Temp); 

} 

功能

bool Serial::ReadPort(CString buf){ 

OpenPort(); 
LPCTSTR dope; 


LPDWORD bytesRead =0; 
char b[4]; 
BOOL ret = ReadFile(sSerial,b,4,bytesRead,NULL) ; 


dope = reinterpret_cast<LPCTSTR>(b); 
AfxMessageBox(dope,0,0); 
return true; 


} 
+0

向我们展示您的代码中打开文件的部分。你检查它是否正确打开? – KBart

回答

5
DWORD bytesRead; 
char b[4]; 
BOOL ret = ReadFile(sSerial,b,4,&bytesRead,NULL) ; 

4个参数必须是接收读取的实际字节数有效的指针。它不能为NULL。更确切地说:只有当lpOverlapped参数不是NULL时,此参数才可以为NULL。

+0

谢谢,完全有效。我还有另外一个问题,现在缓冲区'b'没有像我想的那样被转换为可读的LPCTSTR。我的重新演绎演员有什么问题吗?因为我收到中文符号。 – user1704863

+2

LPCTSTR是一个指向空终止字符串的指针。您缓冲区b包含最多4个字符而不包含终止空字符,长度由bytesRead确定。在处理读取字节时,您应该考虑bytesRead。如果你只想快速调试黑客,那么使b一个char变大,仍然是ReadFile(,, 4 ,,),然后b [bytesRead] ='\ 0'。之后,b是一个以空字符结尾的字符串,您可以将其转换为LPCTSTR。 –

相关问题