首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++写的串口收发程序,能发,但不能接收。开一次网上下的串口调试助手,在关掉,小弟我的程序就可以接收了。真是纠结啊

2012-03-08 
c++写的串口收发程序,能发,但不能接收。开一次网上下的串口调试助手,在关掉,我的程序就可以接收了。真是纠结

c++写的串口收发程序,能发,但不能接收。开一次网上下的串口调试助手,在关掉,我的程序就可以接收了。真是纠结啊!!!!!!
我是通过U转串口线与ARM通讯,我的程序每次给ARM发4个字节的数据,ARM板通过串口回复一个“shoudao”,然后继续等待4个字节的输入。通过ARM上的指示灯判断来看,ARM能正确收到4个字节的数据,并能回复。但是我的程序却停在WaitForSingleObject函数不返回,加上了SetCommTimeouts函数设置超市时间后能接收,但只收到一个字符u或m,我的串口是异步打开的。接收是在一个独立的线程中进行的。接收部分代码如下: 
char recvbuffer[1024]={0};
char test[80];
ULONG i=0;
CMyDlg *dlg=(CMyDlg*)lpParameter;
ULONG errcode,redcode,num,recvnum=1024;
OVERLAPPED ov_read;
DWORD dwErrorFlags,evmask;
COMSTAT comstat;
memset(&ov_read,0,sizeof(OVERLAPPED));
  ov_read.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
  //CString recv_content;
dlg->GetDlgItemText(IDC_RECV,dlg->m_recvstr);
  //WaitCommEvent(m_hcom,&evmask,&ov_read);
while(1)
{

ClearCommError(dlg->m_hcom,&dwErrorFlags,&comstat);
  redcode=ReadFile(dlg->m_hcom,recvbuffer,recvnum,NULL,&ov_read);
 errcode=GetLastError();
if(redcode==0)
{
if(errcode==ERROR_IO_PENDING)
{
 
WaitForSingleObject(ov_read.hEvent,INFINITE);//在没有打开过调试助手或修改超时时间前,此函数一直不返回
//GetOverlappedResult(dlg->m_hcom,&ov_read,&num,TRUE);
 
recvbuffer[ov_read.InternalHigh]='\0';
dlg->m_recvstr+=recvbuffer;
dlg->SetDlgItemText(IDC_RECV,dlg->m_recvstr);

PurgeComm(dlg->m_hcom,PURGE_RXCLEAR);
  ResetEvent(ov_read.hEvent);
}
 
}
  else 
{
dlg->m_recvstr+=recvbuffer;
dlg->SetDlgItemText(IDC_RECV,dlg->m_recvstr);

}

}

 return 1;
此外我还发现,当我打开串口调试助手,然后关掉。再打开我自己的程序,收发就都正常了。再重插一次串口线,就又会不正常。真是郁闷啊。希望高手指点下!!!!!!

[解决办法]
是不是看下串口设置问题?比如说串口没有打开?
[解决办法]
看看这个帖子的3L回答。
http://topic.csdn.net/u/20110310/15/35f224dd-d7c6-406e-a3b0-396f257a112d.html?47878
[解决办法]
首先你得判定ClearCommError中得到的换从区目前存在的字符个数啊,为0,就不用读了,不为0,判断个数是否在你你的数组字节个数,不大于,在读。
另外,要想得到你实际读到的数据的个数,用GetOverlappedResult来得到。
recvbuffer[ov_read.InternalHigh]='\0';这个InternalHigh是什么意思来?

热点排行