天嵌 ARM开发社区

 找回密码
 注册
查看: 10164|回复: 2

wince 串口操作

[复制链接]
TQ-lkp 发表于 2014-9-23 12:22:17 | 显示全部楼层 |阅读模式
    由于c# SerialPort类在串口操作方面存在bug,会概率性的出现串口打开失败的问题,建议使用c++ api来直接操作串口,附件是在网上收集的串口操作类,经测试比较稳定,要用到串口操作的类请使用此类来编程。

   
  1. ///<summary>
  2.         ///建立与串口的连接
  3.         ///</summary>
  4.         public int Open()
  5.         {
  6.             DCB dcb = new DCB();
  7.             COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();

  8.             // 打开串口
  9.             hComm = CreateFile(PortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
  10.             if (hComm == INVALID_HANDLE_VALUE)
  11.             {
  12.                 return -1;
  13.             }
  14.             // 设置通信超时时间
  15.             GetCommTimeouts(hComm, ref ctoCommPort);
  16.             ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
  17.             ctoCommPort.ReadTotalTimeoutMultiplier = 0;
  18.             ctoCommPort.WriteTotalTimeoutMultiplier = 0;
  19.             ctoCommPort.WriteTotalTimeoutConstant = 0;
  20.             SetCommTimeouts(hComm, ref ctoCommPort);

  21.             //设置串口参数
  22.             GetCommState(hComm, ref dcb);
  23.             dcb.DCBlength = Marshal.SizeOf(dcb);
  24.             dcb.BaudRate = BaudRate;
  25.             dcb.flags = 0;
  26.             dcb.DataBits = (byte)DataBits;
  27.             dcb.StopBits = StopBits;
  28.             dcb.Parity = (byte)Parity;

  29.             //------------------------------
  30.             SetDcbFlag(0, 1, dcb);            //二进制方式
  31.             SetDcbFlag(1, (Parity == 0) ? 0 : 1, dcb);
  32.             //SetDcbFlag(2, DtrEnable?1:0, dcb);            //不用CTS检测发送流控制
  33.             //SetDcbFlag(3, RtsEnable?1:0, dcb);            //不用DSR检测发送流控制
  34.             SetDcbFlag(2, 0, dcb);            //不用CTS检测发送流控制
  35.             SetDcbFlag(3, 0, dcb);            //不用DSR检测发送流控制
  36.             SetDcbFlag(4, 0, dcb);            //禁止DTR流量控制
  37.             SetDcbFlag(6, 0, dcb);            //对DTR信号线不敏感
  38.             SetDcbFlag(9, 1, dcb);            //检测接收缓冲区
  39.             SetDcbFlag(8, 0, dcb);            //不做发送字符控制
  40.             SetDcbFlag(10, 0, dcb);           //是否用指定字符替换校验错的字符
  41.             SetDcbFlag(11, 0, dcb);           //保留NULL字符
  42.             SetDcbFlag(12, 0, dcb);           //允许RTS流量控制
  43.             SetDcbFlag(14, 0, dcb);           //发送错误后,继续进行下面的读写操作
  44.             //--------------------------------
  45.             dcb.wReserved = 0;                       //没有使用,必须为0      
  46.             dcb.XonLim = 0;                          //指定在XOFF字符发送之前接收到缓冲区中可允许的最小字节数
  47.             dcb.XoffLim = 0;                         //指定在XOFF字符发送之前缓冲区中可允许的最小可用字节数
  48.             dcb.XonChar = 0;                         //发送和接收的XON字符
  49.             dcb.XoffChar = 0;                        //发送和接收的XOFF字符
  50.             dcb.ErrorChar = 0;                       //代替接收到奇偶校验错误的字符
  51.             dcb.EofChar = 0;                         //用来表示数据的结束     
  52.             dcb.EvtChar = 0;                         //事件字符,接收到此字符时,会产生一个事件      
  53.             dcb.wReserved1 = 0;                      //没有使用

  54.             if (!SetCommState(hComm, ref dcb))
  55.             {
  56.                 return -2;
  57.             }
  58.             IsOpen = true;
  59.             return 0;
  60.         }
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
liangruiqin 发表于 2016-5-8 22:04:58 | 显示全部楼层
xialaikankan
悲晓 发表于 2018-12-14 09:38:31 | 显示全部楼层
谢了!学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 21:21 , Processed in 1.046875 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表