相当急,快又要搞通宵了。WIN CE上的串口编程问题

vincent_1011 2009-06-01 02:08:05
我写了个程序。在WINDOW CE上跑的,我用VS2008建立了个MFC智能程序。

我用串口调试助手测试,助手不停的发送数据。发现助手上能接收CE上发来的消息,可是CE上的程序却一直阻塞(或者我把线程里面的代码改成一直在读的时候。都是没读到任何东西。)

第一次写CE,希望哪位大大指点
具体代码如下:


//按钮事件
OnBnClickedreaddata()
{

if(!OpenCom())
{
MessageBox(L"Open Fail");
return;
}
WriteFile(hCom,"asda22\r\n",20,0,NULL);
CreateThread(
NULL, //安全属性使用缺省。
0, //线程的堆栈大小。
ReadThreadFunc, //线程运行函数地址。
this, //传给线程函数的参数。
0, //创建标志。
0); //成功创建后的线程标识码。
return;
}
/////////////////////////////////////////////////
OpenCom()
{
DWORD dwError;
LPCWSTR lpError=L"com1 open Error",lpOpenSucc=L"com1 open success";
hCom = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hCom == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
MessageBox(lpError);
return FALSE;
}

else
{

SetCommMask (hCom, EV_RXCHAR);//指定端口监测的事件集
SetupComm(hCom,1024,1024);//分配设备缓冲区
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);//初始化缓冲区中的信息

if(!initDCB())
return FALSE;

// if(!InitComTimeouts())//设置端口超时值
// return false;


//设置端口上指定信号的状态
// EscapeCommFunction (hCom, SETDTR);// SETDTR: 发送DTR (data-terminal-ready)信号
// EscapeCommFunction (hCom, SETRTS);// SETRTS: 发送RTS (request-to-send)信号
return true;
}
}

////////////////////////////////////////////////////

initDCB()
{
DWORD dwError;
dcb.DCBlength=sizeof(DCB);
GetCommState(hCom,&dcb);
dcb.BaudRate = 9600; //波特率为9600
dcb.ByteSize = 8; //数据位数为8位
dcb.Parity = 0; //偶校验
dcb.StopBits = ONESTOPBIT; //1个停止位
dcb.fBinary =TRUE;
if (!SetCommState(hCom, &dcb))
{
MessageBox(L"Set DBC Error");
dwError = GetLastError ();
return FALSE;
}
else
{

return TRUE;
}
}
//////////////////////////////////////////////////////////////
DWORD WINAPI ReadThreadFunc(LPVOID lparam)
{

Cwince_AppDlg * Dlg = (Cwince_AppDlg*)lparam;
BYTE Byte;
int iCounter = 0;
DWORD dwBytes;
char ReceiveBuf[1000]; ///缓冲区的大小

SetCommMask (Dlg->hCom, EV_RXCHAR); ///只接收字符
while (Dlg->hCom != INVALID_HANDLE_VALUE)
{
DWORD dwCommStatus;
WaitCommEvent(Dlg->hCom, &dwCommStatus, 0);
SetCommMask (Dlg->hCom, EV_RXCHAR); ///重新设置要等待的信号
//// 接收数据
do
{
ReadFile(Dlg->hCom, &Byte, 1, &dwBytes, 0);
if(dwBytes == 1)
{
MessageBox(NULL,L"get ",NULL,NULL);
ReceiveBuf[iCounter++] = Byte;
if(iCounter == 1000)
{
///L"接收缓冲区已满";
return -1;
}
}
} while (dwBytes == 1);
if(iCounter == 0) ///没接到数据
{
continue;
}
} ///////end while
return 0;

}
...全文
235 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
evccode 2009-06-02
  • 打赏
  • 举报
回复
关于WINCE串口问题,一般开发板中自带有。

而且网上源码也很多,可以参考的。

提供一个嵌入式开发网站:

http://www.evccode.com
Codings 2009-06-02
  • 打赏
  • 举报
回复
一般应该是线程没被Kill掉
Roy_ly 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 vincent_1011 的回复:]
发现退出pc上的助手后,CPU100%,任务管理员显示是这个助手进程还在。
[/Quote]

CPU 100%的话很有可能是死循环啊,检查一下你的代码,有可能不是串口的问题哦,是其他线程或者界面之类什么的,细心点检查一下吧。
Roy_ly 2009-06-02
  • 打赏
  • 举报
回复
会不会是DCB没有设置对的问题?流控,波特率这些参数有没设置好?
vincent_1011 2009-06-02
  • 打赏
  • 举报
回复
发现退出pc上的助手后,CPU100%,任务管理员显示是这个助手进程还在。
vincent_1011 2009-06-02
  • 打赏
  • 举报
回复
找了个serial的类,用着不错。不过碰到个相当奇怪的一些问题。

我我用了2个助手,一个在PC上跑,一个在CE上跑。一开机的时候都可以通信了。

可是后来我关了PC上的助手,然后用XP的超级终端发送,CE就收不到了。后来换回PC上的助手发送。CE还是收不到。

气死了
vincent_1011 2009-06-01
  • 打赏
  • 举报
回复
再顶啊,。。。。为啥呢。。。
wolong98 2009-06-01
  • 打赏
  • 举报
回复
直接使用 cnComm 类吧
lyx_wq 2009-06-01
  • 打赏
  • 举报
回复
UP
xqhrs232 2009-06-01
  • 打赏
  • 举报
回复
下个例子去参考
huabinsir 2009-06-01
  • 打赏
  • 举报
回复
邦顶.
zhj8727 2009-06-01
  • 打赏
  • 举报
回复
uping
Codings 2009-06-01
  • 打赏
  • 举报
回复
ReadThreadFunc函数去拷贝个成熟的代码吧
kaiyi1986 2009-06-01
  • 打赏
  • 举报
回复
会不会是你的程序占用了太多资源,你的程序没有等到串口事件就一直在读,一直等到读到数据才退出。
还有一个问题,你是先写在去起动读线程,这样有可能读不到数据,最好是先起动在去读。
shuiyan 2009-06-01
  • 打赏
  • 举报
回复
ce上的建议你先找个例程跑一下,因为串口的线程设计一向比较绕人的。然后看该例程的代码,尝试自己修改,然后再尝试自己写。
会思考的草 2009-06-01
  • 打赏
  • 举报
回复
wince段的串口驱动工作正常?

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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