近来做WINCE下RS232串口通讯,遇到串口数据无法送出来的问题 。郁闷啊!在网上找了很久资料,终于知道是什么原因了!并将相关通讯代码发上来,为同行提供一些借鉴!
我们使用的是研祥的EC3-1547的工控板,X86内核,使用WINCE.net!在使用串口通讯的过程中COM1无法发送/接收到任何数据,通过测试,可以确定串口完好,在使用研祥提供的串口测试工具进行测试时依然无法发送/收到数据,使用试波器对通讯过程的串口进行监测,无数据发送出来。观察WINCE的启动过程发现在启动过程中有系统的调试信息从COM1输出。研祥提供了其它定制的WINCE系统依然如此。最后在网上寻找相关资料,得到这样一个信息:通常情况下WINCE采用COM1做调试信息的输出用途,要在正式产品前去掉COM1的调试功能。
WINCE串口通讯代码:
//打开串口
hHandel=CreateFile("COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(hHandel==(HANDLE)-1)
{
return false;
}
//进行配置
dcb.DCBlength=sizeof(DCB);
GetCommState(hHandel,&dcb);
dcb.Parity=NOPARITY;
dcb.ByteSize=8;
dcb.BaudRate=9600;
dcb.StopBits=ONESTOPBIT;
re=SetCommState(hHandel,&dcb);
if(!re)
{
return false;
}
//超时设置
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts (hHandel, &CommTimeouts);//取得时间参数
CommTimeouts.ReadIntervalTimeout = MAXDWORD; //最大时间参数
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.ReadTotalTimeoutConstant = 3000; //此处值真正有用
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts (hHandel, &CommTimeouts);
//清空串口缓存
PurgeComm(hHandel,PURGE_RXCLEAR);
PurgeComm(hHandel,PURGE_TXCLEAR);
//发送
BYTE TempBuf[24];
DWORD dwBytesRead;
CString ErrorInfo;
if(WriteFile(hHandel,TempBuf,sizeof(TempBuf),&dwBytesRead,NULL))
{
}
//接收
if(ReadFile(hHandel,TempBuf,sizeof(TempBuf),&dwBytesRead,NULL))
{
//判断是否超时
if(dwBytesRead<sizeof(TempBuf))
{
ErrorInfo.Format(_T("接收超时!"));
return false;
}
else
{
}
}
else
{
ErrorInfo.Format(_T("接收失败!"));
return false;
}