5357|16

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

相当急,快又要搞通宵了。WIN CE上的串口编程问题 [复制链接]

我写了个程序。在WINDOW CE上跑的,我用VS2008建立了个MFC智能程序。

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

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


  1. //按钮事件
  2. OnBnClickedreaddata()
  3. {

  4.                 if(!OpenCom())
  5.                 {
  6.                         MessageBox(L"Open Fail");
  7.                 return;
  8.                 }
  9. WriteFile(hCom,"asda22\r\n",20,0,NULL);
  10. CreateThread(
  11.                          NULL,                    //安全属性使用缺省。
  12.                          0,                         //线程的堆栈大小。
  13.                          ReadThreadFunc,                 //线程运行函数地址。
  14.                          this,               //传给线程函数的参数。
  15.                          0,                         //创建标志。
  16.                          0);       //成功创建后的线程标识码。
  17.         return;
  18. }
  19. /////////////////////////////////////////////////
  20. OpenCom()
  21. {
  22.         DWORD dwError;
  23.         LPCWSTR lpError=L"com1 open Error",lpOpenSucc=L"com1 open success";
  24.         hCom = CreateFile(L"COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  25.         if (hCom == INVALID_HANDLE_VALUE)
  26.         {
  27.                 dwError = GetLastError();
  28.                 MessageBox(lpError);
  29.                 return FALSE;
  30.         }
  31.        
  32.         else
  33.         {

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

  37.                 if(!initDCB())
  38.                         return FALSE;
  39.                
  40. //       if(!InitComTimeouts())//设置端口超时值
  41. //             return false;


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

  48. ////////////////////////////////////////////////////

  49. initDCB()
  50. {
  51.         DWORD dwError;
  52.         dcb.DCBlength=sizeof(DCB);
  53.         GetCommState(hCom,&dcb);
  54.         dcb.BaudRate = 9600; //波特率为9600
  55.         dcb.ByteSize = 8; //数据位数为8位
  56.         dcb.Parity = 0; //偶校验
  57.         dcb.StopBits = ONESTOPBIT; //1个停止位
  58.         dcb.fBinary        =TRUE;
  59.         if (!SetCommState(hCom, &dcb))
  60.         {
  61.                 MessageBox(L"Set DBC Error");
  62.                 dwError = GetLastError ();
  63.                 return FALSE;
  64.         }
  65.         else
  66.         {
  67.                
  68.                 return TRUE;
  69.         }
  70. }
  71. //////////////////////////////////////////////////////////////
  72. DWORD WINAPI ReadThreadFunc(LPVOID lparam)
  73. {

  74.        Cwince_AppDlg  * Dlg = (Cwince_AppDlg*)lparam;
  75.        BYTE   Byte;
  76.        int    iCounter = 0;
  77.        DWORD   dwBytes;
  78.        char    ReceiveBuf[1000];  ///缓冲区的大小     
  79.               
  80.        SetCommMask (Dlg->hCom, EV_RXCHAR);   ///只接收字符
  81.        while (Dlg->hCom != INVALID_HANDLE_VALUE)
  82.        {
  83.               DWORD  dwCommStatus;
  84.                           WaitCommEvent(Dlg->hCom, &dwCommStatus, 0);
  85.               SetCommMask (Dlg->hCom, EV_RXCHAR); ///重新设置要等待的信号
  86.               //// 接收数据
  87.               do
  88.               {
  89.                      ReadFile(Dlg->hCom, &Byte, 1, &dwBytes, 0);                        
  90.                      if(dwBytes == 1)
  91.                      {
  92.                                                  MessageBox(NULL,L"get ",NULL,NULL);
  93.                             ReceiveBuf[iCounter++] = Byte;
  94.                             if(iCounter == 1000)
  95.                             {
  96.                                    ///L"接收缓冲区已满";
  97.                                    return -1;
  98.                             }
  99.                      }                          
  100.               } while (dwBytes == 1);
  101.               if(iCounter == 0)  ///没接到数据
  102.               {
  103.                      continue;
  104.               }
  105.        } ///////end while
  106.        return 0;

  107. }
复制代码

最新回复

关于WINCE串口问题,一般开发板中自带有。 而且网上源码也很多,可以参考的。 提供一个嵌入式开发网站: http://www.evccode.com  详情 回复 发表于 2009-6-2 21:19
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
uping
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
邦顶.
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
下个例子去参考
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
UP
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
再顶啊,。。。。为啥呢。。。
 
 
 

回复

59

帖子

0

TA的资源

禁止访问

7
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
ce上的建议你先找个例程跑一下,因为串口的线程设计一向比较绕人的。然后看该例程的代码,尝试自己修改,然后再尝试自己写。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
会不会是你的程序占用了太多资源,你的程序没有等到串口事件就一直在读,一直等到读到数据才退出。
还有一个问题,你是先写在去起动读线程,这样有可能读不到数据,最好是先起动在去读。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
ReadThreadFunc函数去拷贝个成熟的代码吧
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
直接使用 cnComm 类吧
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
找了个serial的类,用着不错。不过碰到个相当奇怪的一些问题。

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

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

气死了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
发现退出pc上的助手后,CPU100%,任务管理员显示是这个助手进程还在。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
会不会是DCB没有设置对的问题?流控,波特率这些参数有没设置好?
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 vincent_1011 的回复:
发现退出pc上的助手后,CPU100%,任务管理员显示是这个助手进程还在。


CPU 100%的话很有可能是死循环啊,检查一下你的代码,有可能不是串口的问题哦,是其他线程或者界面之类什么的,细心点检查一下吧。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

16
 
一般应该是线程没被Kill掉
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

17
 
关于WINCE串口问题,一般开发板中自带有。

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

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

http://www.evccode.com
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表