最近自己用VC++写了个串口收发的程序,但是程序发送是正常的,接收不正常,需先打开在关掉调试助手才能接
我是通过U转串口线与ARM通讯,我的程序每次给ARM发4个字节的数据,ARM板通过串口回复一个“shoudao”,然后继续等待4个字节的输入。通过ARM上的指示灯判断来看...
我是通过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;
此外我还发现,当我打开串口调试助手,然后关掉。再打开我自己的程序,收发就都正常了。再重插一次串口线,就又会不正常。真是郁闷啊。 展开
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;
此外我还发现,当我打开串口调试助手,然后关掉。再打开我自己的程序,收发就都正常了。再重插一次串口线,就又会不正常。真是郁闷啊。 展开
2个回答
展开全部
你这段程序的问题在于ReadFile函数在线程中本来就可以进入阻塞,不需要用信号量来进行控制。如果采用信号量也是用于和其它线程之间的交互控制,试试不采用信号量进行控制就OK了。
更多追问追答
追问
我的用异步方式创建的串口句柄,ReadFile在调用之后就返回了,并不阻塞线程啊!
追答
readFIle函数进入阻塞,当读不到数据时就停在那儿了,如果不信,你可以不用线程的方式,看看程序会不会未响应
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询