请高手指点:串口数据接收不到!内含全部代码...

blue2moon 2003-08-18 04:19:18
打开端口:
if( ( m_hCom = ::CreateFile(strCom,
GENERIC_WRITE|GENERIC_READ,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,//
NULL
) ) == (HANDLE) -1 )
{
return -1; //Com Init Error
}

// setup device buffers
::SetupComm(m_hCom, 4096, 4096);

// purge any information in the buffer
//::PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;这一句作用是什么?

EscapeCommFunction(m_hCom,SETDTR);
EscapeCommFunction(m_hCom,SETRTS);

// set up for overlapped I/O
COMMTIMEOUTS CommTimeOuts ;
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //¶Á¼ä¸ô³¬Ê±(µ¥¸ö×Ö·ûÁ½¸ö×Ö·ûµÄ×î´óÑÓʱ
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ; //¶Áʱ¼äϵÊý
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //¶Áʱ¼ä³£Á¿
CommTimeOuts.WriteTotalTimeoutMultiplier = 10 ; //дʱ¼äϵÊý
CommTimeOuts.WriteTotalTimeoutConstant = 1000 ; //дʱ¼ä³£Á¿
SetCommTimeouts(m_hCom, &CommTimeOuts ) ; //×ܳ¬Ê±£½ÏµÊý¡ÁÒªÇó¶ÁдµÄ×Ö·ûÊý£«Ê±¼ä³£Á¿

DCB dcb;
if (!GetCommState(m_hCom, &dcb))
{
CloseHandle(m_hCom);
return -1; //Com Init Error
}

dcb.BaudRate = CBR_19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
if( !::SetCommState(m_hCom, &dcb) )
{
::CloseHandle(m_hCom);
return -1; //Com InitError
}
return 0;

写数据:
DWORD nBytesToWrite =0;
DWORD dwBytesWritten = 0;

CString strTmp=m_strSendMsg;//写入串口的数据
nBytesToWrite= strTmp.GetLength();

char *pszMessage = new char[nBytesToWrite + 1];
for(int i = 0; i<nBytesToWrite; i++)
pszMessage[i] = strTmp.GetAt(i);
pszMessage[i] = '\0';
if (!WriteFile(m_hCom, pszMessage, nBytesToWrite, &dwBytesWritten, NULL))
{
TRACE(_T("Write to COM Error:\n"));
delete [] pszMessage;//zhangzf
return FALSE;//zhangzf
}

delete [] pszMessage;

return TRUE;

读数据:
char cRcvBuf[MAX_RCV_LEN + 1];
DWORD dwRcvLen;
DWORD dwResult;

//::SetCommMask(m_hCom,EV_RXFLAG);加上这一句后程序将死在waitcommevent处!

DWORD dwCommModemStatus;
WaitCommEvent(m_hCom,&dwCommModemStatus,0);
//::SetCommMask(m_hCom,EV_RXFLAG);
if(dwCommModemStatus & EV_RXFLAG)//EV_RXCHAR
{
//Loop for waiting for the data
memset(cRcvBuf, 0, MAX_RCV_LEN + 1);
ReadFile(m_hCom,cRcvBuf,MAX_RCV_LEN,&dwRcvLen,NULL);

CString strTmp;
int strLen = dwRcvLen;
for(int i = 0; i<dwRcvLen; i++)
strTmp += (TCHAR)cRcvBuf[i];

m_strReceiveMsg=strTmp;//zhangzf

}
PurgeComm(m_hCom,PURGE_RXCLEAR);

return TRUE;

关闭端口:

if(m_hCom != INVALID_HANDLE_VALUE)
CloseHandle(m_hCom);

模拟器上单步调试,可以正常写入数据,但不能读出,永远不执行if(dwCommModemStatus & EV_RXFLAG)内的代码。是否SetCommMask函数的参数设置
不正确,请指点,谢谢!
...全文
129 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyq22 2003-09-02
  • 打赏
  • 举报
回复
确实是这样:
设置SetCommMask(EV_RXCHAR)以后,程序就停在WaitCommEvent处,直到监测到
有字符出现.
你可以用SetCommTimeouts设置读写超时.
如果你的程序还需执行其他工作,最好的方式是建立线程进行读写操作.

custgod 2003-08-21
  • 打赏
  • 举报
回复
不SetCommMask肯定收不到数据的.
itisajoke 2003-08-21
  • 打赏
  • 举报
回复
::SetCommMask(m_hCom,EV_RXFLAG);
应该是
::SetCommMask(m_hCom,EV_RXCHAR);
WaitCommEvent(m_hCom,&dwCommModemStatus,0);
//::SetCommMask(m_hCom,EV_RXCHAR);
if(dwCommModemStatus & EV_RXCHAR)//EV_RXCHAR
{
//
}
Nisj 2003-08-20
  • 打赏
  • 举报
回复
把所有的读的操作放到一个线程中去实现!不SetCommMask肯定收不到数据的.
blue2moon 2003-08-19
  • 打赏
  • 举报
回复
程序就停在WaitCommEvent处怎么行?我想设置一个等待时间,该在哪里写代码?
blue2moon 2003-08-19
  • 打赏
  • 举报
回复
设置SetCommMask(EV_RXCHAR)以后,是否程序就停在WaitCommEvent处,直到监测到
有字符出现?
jackyuke 2003-08-19
  • 打赏
  • 举报
回复
应该是EV_RXCHAR
EV_RXFLAG好像是对特定的char有用
hansin 2003-08-19
  • 打赏
  • 举报
回复
最好检查一下SetCommMask的返回值。
WaitCommEvent(m_hCom,&dwCommModemStatus,0);里的0与NULL有没有区别?
blue2moon 2003-08-19
  • 打赏
  • 举报
回复
为什么没人关心一下?......

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧