wince 6.0 串口 读取 readfile 超时问题
时间:10-02
整理:3721RD
点击:
现有一个工程 程序启动开启两个线程 一个接收线程(rev_thread),一个接收线程(rev_thread),接收线程(rev_thread)一直工作,发送线程(send_thread)通过 按下触摸屏(OnLButtonDown)触发,每个单独线程工作时,都需要readfile、writefile。触摸屏按下时,先挂起 (SuspendThread)接收线程(rev_thread),再通过标志位(flag) 触发 发送线程(send_thread),待发送线程(send_thread)结束后,恢复(ResumeThread)接收线程(rev_thread),让接收线程(rev_thread)开始工作。经过测试,程序启动后,按下触摸屏,断点测试,程序会卡在发送线程(rev_thread)中的readfile()函数 7-10s。单独建工程测试 接收线程(rev_thread)、接收线程(rev_thread),都能正常工作,不会卡在readfile()函数这里。
附上部分代码:
超时设置:
COMMTIMEOUTS CommTimeOuts;
HANDLE Revhdser = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(Revhdser == INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
return FALSE;
}
DCB dcb;
GetCommState(Revhdser, &dcb); /* 读取串口的DCB */
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fParity = FALSE; /* 禁止奇偶校验 */
dcb.fBinary = TRUE;
dcb.fDtrControl = 0; /* 禁止流量控制 */
dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
//设置状态参数
SetCommMask(Revhdser, EV_RXCHAR); /* 串口事件:接收到一个字符 */
SetupComm(Revhdser, 1024, 1024); /* 设置接收与发送的缓冲区大小 */
GetCommTimeouts(Revhdser, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 10; /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0; /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(Revhdser, &CommTimeOuts);
发送线程 部分代码:
SuspendThread(hrevThread);//挂起接收线程
main_tx( );//发送函数
ResumeThread(hrevThread); //恢复接收线程
附上部分代码:
超时设置:
COMMTIMEOUTS CommTimeOuts;
HANDLE Revhdser = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(Revhdser == INVALID_HANDLE_VALUE)
{
MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));
return FALSE;
}
DCB dcb;
GetCommState(Revhdser, &dcb); /* 读取串口的DCB */
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fParity = FALSE; /* 禁止奇偶校验 */
dcb.fBinary = TRUE;
dcb.fDtrControl = 0; /* 禁止流量控制 */
dcb.fRtsControl = 0;
dcb.fOutX = 0;
dcb.fInX = 0;
dcb.fTXContinueOnXoff = 0;
//设置状态参数
SetCommMask(Revhdser, EV_RXCHAR); /* 串口事件:接收到一个字符 */
SetupComm(Revhdser, 1024, 1024); /* 设置接收与发送的缓冲区大小 */
GetCommTimeouts(Revhdser, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 10; /* 接收字符间最大时间间隔 */
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0; /* 读数据总超时常量 */
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(Revhdser, &CommTimeOuts);
发送线程 部分代码:
SuspendThread(hrevThread);//挂起接收线程
main_tx( );//发送函数
ResumeThread(hrevThread); //恢复接收线程