WINXP下用API编写的串口为什么不能发送数据?

kangcy 2003-08-22 05:46:24
我有一个以API写的串口程序在WIN98下运行正常,但在WINXP下不能发送数据,听说加延时可以解决,这应该如何做?
我使用COM1既接受又发送.
...全文
72 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
AthlonxpX86 2003-08-25
  • 打赏
  • 举报
回复
你的代码堵塞的主要原因是,串口没有接受到任何数据或者没有发送出任何数据(SetCommMask(COMDEV(pComm1),EV_RXCHAR|EV_TXEMPTY)),所以监控线程中就会停在
if ( !WaitCommEvent(COMDEV(pComm1),&dwEvtMask,&os ) )
{
if (ERROR_IO_PENDING == GetLastError() )
GetOverlappedResult( COMDEV(pComm1), &os, &dwTransfer, TRUE);
}
1 你程序错误的原因:
因为你的发送数据的代码是错误的,导致writefile根本没有发送数据,如果通讯的两个产口都用你的程序,因为你的程序不能发送数据,所以也不可能接收到数据,导致不可能产生EV_RXCHAR 或者EV_TXEMPTY这两个事件,监控线程会停止在GetOverlappedResult( COMDEV(pComm1), &os, &dwTransfer, TRUE);

2修正你的程序,发送数据不能成功,是因为WriteFile(COMDEV(pComm1), &senddata,dwBytesWritten,&dwBytesWritten,&write_OS(pComm1));中的write_OS(pComm1)没有初始化,注意这个os必须初始化为0,你可以在BOOL CMytry1Dlg::OnInitDialog()中加入memset(&READ_OS(pComm1), 0, sizeof(OVERLAPPED));另外,最好是把readfile和writefile用的os分开,不要共用一个


MSDN:
If hFile was opened with FILE_FLAG_OVERLAPPED, the lpOverlapped parameter must not be NULL. It must point to a valid OVERLAPPED structure. If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function can incorrectly report that the operation is complete.


Sander 2003-08-24
  • 打赏
  • 举报
回复
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(COMDEV(pComm1), &CommTimeOuts );
Sander 2003-08-24
  • 打赏
  • 举报
回复
我是说你的read timeout是太长(0xfffffff)一般10ms就可以啦
AthlonxpX86 2003-08-24
  • 打赏
  • 举报
回复
................给我发那么多端消息干什么?这个你看看CommTimeOuts的设置。另外还有os也会引响堵塞,但具体设置方法我忘了,我现在在网吧,没有资料和工具帮你看,如果不介意,把你的工程代码发给我,我帮你调试吧,yds_086@163.com
kangcy 2003-08-23
  • 打赏
  • 举报
回复
我查了一下原因是辅助线程中
WaitCommEvent(COMDEV(pComm1),&dwEvtMask,&os )不能正确返回dwEvtMask的值,请问这是为什么?
kangcy 2003-08-23
  • 打赏
  • 举报
回复
我用COM1异步发送后再异步接受,主线程发送,辅助线程接受数据.
kangcy 2003-08-23
  • 打赏
  • 举报
回复
好想是堵塞了,请问如何设置os中数据传输延迟的设置.
辅助线程进入第一次if ( ERROR_IO_PENDING == GetLastError() )
GetOverlappedResult( pComm, &os, &dwTransfer, TRUE);就在不启动了.
kangcy 2003-08-23
  • 打赏
  • 举报
回复
好想是堵塞了,请问如何设置os中数据传输延迟的设置.
kangcy 2003-08-23
  • 打赏
  • 举报
回复
//打开COM1
if (( COMDEV(pComm1)= CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE , 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL )) == (HANDLE) -1)
return false;
else
{
MessageBox("Com1 is open!", "ok",
MB_ICONEXCLAMATION | MB_OK ) ;
SetCommMask(COMDEV(pComm1), EV_RXCHAR|EV_TXEMPTY );
// get any early notifications
SetupComm(COMDEV(pComm1), 4096, 4096);
// setup device buffers
PurgeComm(COMDEV(pComm1), PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR ); //清干净输入、输出缓冲区
// set up for overlapped nonblocking I/O
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(COMDEV(pComm1), &CommTimeOuts );
}
fRetVal = SetupCommRes1();
if (fRetVal)
{
CONNECTED(pComm1)= TRUE; //建立通信监视线程
pWatchThread=AfxBeginThread(CommWatchProc,
// Thread func
(LPVOID)&pComm1, // pParam
THREAD_PRIORITY_NORMAL, // Priority
(UINT)0, // StackSize
(DWORD)CREATE_SUSPENDED, // 挂起线程
(LPSECURITY_ATTRIBUTES)NULL );
// SecurityAttrs
if (pWatchThread == NULL)
{
CONNECTED(pComm1) = FALSE;
CloseHandle(COMDEV(pComm1));
fRetVal=FALSE;
}
else
{
pWatchThread->ResumeThread(); // 启动通信监视线程
EscapeCommFunction(COMDEV(pComm1),SETDTR);

fRetVal = TRUE; // successfully
}
}
else
{
CONNECTED(pComm1) = FALSE;
CloseHandle(COMDEV(pComm1));
}
return ( fRetVal );


UINT CommWatchProc(LPVOID pParam)
{
DWORD dwTransfer,dwEvtMask;
PCOMM1 pComm;
pComm=(PCOMM1)pParam;
PCOMM pComm1;
pComm1=*pComm;
OVERLAPPED os;
os.hEvent = CreateEvent (NULL, TRUE, FALSE, NULL );
if (os.hEvent == NULL)
{
MessageBox(NULL, "Failed to create event for thread!", "ProcessCOMMN otification", MB_ICONEXCLAMATION | MB_OK );
return FALSE;
}
if (!SetCommMask(COMDEV(pComm1),EV_RXCHAR|EV_TXEMPTY))
return FALSE;
while (COMDEV(pComm1))
{
dwEvtMask = 0;
// 等待通信事件(重叠I/O)
if (!WaitCommEvent(COMDEV(pComm1),&dwEvtMask,&os ))
{
if ( ERROR_IO_PENDING == GetLastError() )
GetOverlappedResult( pComm, &os, &dwTransfer, TRUE);
}

if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
MessageBox(NULL,"Thread Receive EV_RXCHAR","OK",MB_OK);
WaitForSingleObject(POSTEVENT(pComm1),0xFFFFFFFF );
ResetEvent(POSTEVENT( pComm1));
PostMessage(HWND_BROADCAST,WM_COMMNOTIFY,(WPARAM)COMDEV(pComm1),MAKELONG(CN_EVENT,0) );

我短接COM1 2,3脚,先在主线程中向COM1写入数据,同时在辅助线程中接收数据.
AthlonxpX86 2003-08-23
  • 打赏
  • 举报
回复
一般只有同步方式才会堵塞啊,http://61.153.195.10:8080/view.asp?file=75

是WaitCommEvent堵塞了还是返回错误?os中有数据传输延迟的设置,通过这个可以防止堵塞。

另外能不能把你的串口代码都贴上来?你这样很不好分析原因啊
AthlonxpX86 2003-08-22
  • 打赏
  • 举报
回复
用的是不是异步多线程吗?不要用同步方式

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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