C#调用API串口通信.doc
《C#调用API串口通信.doc》由会员分享,可在线阅读,更多相关《C#调用API串口通信.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c#调api串口通信 分类: C# 在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort类是否有问题,所以最后决定用纯API函数实现串口读写。先从网上搜索相关代码(关键字:C# API 串口),发现网上相关的资料大约来源于一个版本,那就是所谓的msdn提供的样例代码(msdn的具体出处,我没有考证),其它的代码大都是它的变种。其实这个示例代码是有问题的,也就是说DCB结构体声明的有问题,虽然该代码可以正常通信,不过如果你设置了奇偶校验的话,你会发现奇偶校验无效。VC中的DCB结构声明如下:typedef struct _DCB DWORD DCBleng
2、th; /* sizeof(DCB) */ DWORD BaudRate; /* Baudrate at which running */ DWORD fBinary: 1; /* Binary Mode (skip EOF check) */ DWORD fParity: 1; /* Enable parity checking */ DWORD fOutxCtsFlow:1; /* CTS handshaking on output */ DWORD fOutxDsrFlow:1; /* DSR handshaking on output */ DWORD fDtrControl:2;/*
3、 DTR Flow control */ DWORD fDsrSensitivity:1; /* DSR Sensitivity */ DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */ DWORD fOutX: 1; /* Enable output X-ON/X-OFF */ DWORD fInX: 1; /* Enable input X-ON/X-OFF */ DWORD fErrorChar: 1;/* Enable Err Replacement */ DWORD fNull: 1; /* Enable Null
4、 stripping */ DWORD fRtsControl:2;/* Rts Flow control */ DWORD fAbortOnError:1; /* Abort all reads and writes on Error */ DWORD fDummy2:17; /* Reserved */ WORD wReserved; /* Not currently used */ WORD XonLim; /* Transmit X-ON threshold */ WORD XoffLim; /* Transmit X-OFF threshold */ BYTE ByteSize; /
5、* Number of bits/byte, 4-8 */ BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */ BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */ char XonChar; /* Tx and Rx X-ON character */ char XoffChar; /* Tx and Rx X-OFF character */ char ErrorChar; /* Error replacement char */ char EofChar; /* End of Input character */ cha
6、r EvtChar; /* Received Event character */ WORD wReserved1; /* Fill for now. */ DCB, *LPDCB;有问题的代码DCB结构声明如下:StructLayout(LayoutKind.Sequential) public struct DCB public int DCBlength; public int BaudRate; public int fBinary; public int fParity; public int fOutxCtsFlow; public int fOutxDsrFlow; public
7、 int fDtrControl; public int fDsrSensitivity; public int fTXContinueOnXoff; public int fOutX; public int fInX; public int fErrorChar; public int fNull; public int fRtsControl; public int fAbortOnError; public int fDummy2; public uint flags; public ushort wReserved; public ushort XonLim; public ushor
8、t XoffLim; public byte ByteSize; public byte Parity; public byte StopBits; public byte XonChar; public byte XoffChar; public byte ErrorChar; public byte EofChar; public byte EvtChar; public ushort wReserved1; 对C+比较熟悉网友应该知道,结构体中这种格式的声明,如DWORD fBinary: 1;是以位为单位进行变量设置的,DCB中相关位一共占4个字节,也就是相当于C#中的一个int变量所
9、占的空间。很明显上面的DCB结构会有问题,实际上后面你设置的串口参数,如奇偶校验由于偏移有问题,虽然你设置了,其实都没有设置成功。其实也不是我说人家的DCB声明错了就错了,在SerialPort类中你就可以找到微软官方自己的DCB声明(需要反编译SerialPort类),声明如下:StructLayout(LayoutKind.Sequential) public struct DCB public int DCBlength; public int BaudRate; public uint Flags; public ushort wReserved; public ushort XonL
10、im; public ushort XoffLim; public byte ByteSize; public byte Parity; public byte StopBits; public byte XonChar; public byte XoffChar; public byte ErrorChar; public byte EofChar; public byte EvtChar; public ushort wReserved1; 并且专门有一个设置位标志的函数,如下:internal void SetDcbFlag(int whichFlag, int setting) uin
11、t num; setting = setting whichFlag; if (whichFlag = 4) | (whichFlag = 12) num = 3; else if (whichFlag = 15) num = 0x1ffff; else num = 1; dcb.flags &= (num whichFlag); dcb.flags |= (uint)setting; 经过修改能正确运行的API代码如下(注意,由于我是在WinCE平台上运行,所以DLL的路径为/windows/coredll.dll,你修改为kernel32后即可在PC机使用):/ / API串口类 / pu
12、blic class CommPort / /端口名称(COM1,COM2.COM4.) / public string Port = COM1:; / /波特率9600 / public int BaudRate = 9600; / /数据位4-8 / public byte ByteSize = 8; /4-8 / /奇偶校验0-4=no,odd,even,mark,space / public byte Parity = 0; /0-4=no,odd,even,mark,space / /停止位 / public byte StopBits = 0; /0,1,2 = 1, 1.5, 2
13、 / /超时长 / public int ReadTimeout = 200; / /串口是否已经打开 / public bool Opened = false; / / COM口句柄 / private int hComm = -1; #region API相关定义 private const string DLLPATH = /windows/coredll.dll; / PC机请使用kernel32.dll; / / WINAPI常量,写标志 / private const uint GENERIC_READ = 0x; / / WINAPI常量,读标志 / private const
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 调用 API 串口 通信
限制150内