0

0

在C#中实现串口通信的方法

大家讲道理

大家讲道理

发布时间:2016-11-10 10:20:59

|

2125人浏览过

|

来源于php中文网

原创

通常,在C#中实现串口通信,我们有四种方法:  
第一:通过MSCOMM控件这是最简单的,最方便的方法。可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围。可以访问http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=320 ,一个国外网友的写的教程,作者很热心,我曾有发邮件给他,很快就回复了。  
   
第二:微软在.NET新推出了一个串口控件,基于.NET的P/Invoke调用方法实现,详细的大家可以访问微软网站http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx,方便得到更多资料。  
   
第三:就是用第三方控件啦,可一般都要付费的,不太合实际,不作考虑  
   
第四:自己用API写串口通信,这样难度高点,但对于我们来说,可以方便实现自己想要的各种功能  
   
在本文,我们采用第四种方法来实现串口通信,不过不是自己写,用一个国外网友现成的已经封装好的类库,不过功能简单点,相对我们来说已经够用了。  
   
在整个终端短信的操作过程中,与串口的通信,只用到了四个功能,打开、写、读、关闭串口。下面是类库对这四个功能的定义:  
   
打开串口:  
   
函数原型:public void Open()  
   

说明:打开事先设置好的端口

示例: 

using JustinIO; 
   
static JustinIO.CommPort ss_port = new JustinIO.CommPort(); 
ss_port.PortNum = COM1; //端口号 
ss_port.BaudRate = 19200; //串口通信波特率 
ss_port.ByteSize = 8; //数据位 
ss_port.Parity = 0; //奇偶校验 
ss_port.StopBits = 1;//停止位 
ss_port.ReadTimeout = 1000; //读超时 
try 
{ 
 if (ss_port.Opened) 
 { 
  ss_port.Close(); 
  ss_port.Open(); //打开串口 
 } 
 else 
 { 
  ss_port.Open();//打开串口 
 } 
 return true; 
} 
catch(Exception e)  
{ 
 MessageBox.Show("错误:" + e.Message); 
 return false; 
}

   

写串口: 

   

函数原型:public void Write(byte[] WriteBytes) 

   

WriteBytes 就是你的写入的字节,注意,字符串要转换成字节数组才能进行通信 

   

示例: 

   

ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMI\r")); //获取手机品牌 

   

读串口: 

   

函数原型:public byte[] Read(int NumBytes) 

   

NumBytes 读入缓存数,注意读取来的是字节数组,要实际应用中要进行字符转换 

ASP.NET 4.0电子商城
ASP.NET 4.0电子商城

在现实生活中的购物过程,购物者需要先到商场,找到指定的产品柜台下,查看产品实体以及标价信息,如果产品合适,就将该产品放到购物车中,到收款处付款结算。电子商务网站通过虚拟网页的形式在计算机上摸拟了整个过程,首先电子商务设计人员将产品信息分类显示在网页上,用户查看网页上的产品信息,当用户看到了中意的产品后,可以将该产品添加到购物车,最后使用网上支付工具进行结算,而货物将由公司通过快递等方式发送给购物者

下载

   

示例: 

   

string response = Encoding.ASCII.GetString(ss_port.Read(128)); //读取128个字节缓存 

   

关闭串口: 

   

函数原型:ss_port.Close() 

   

示例: 

   

ss_port.Close(); 

   

由于篇幅,以及串口通信涉及内容广泛,我在这里只讲这些。 

   

在上面我们已经把终端短信所需的各种原始技术有所了解,是可以小试牛刀的时候了。

using System; 
using System.Runtime.InteropServices; 
   
namespace BusApp 
{ 
 ///  
 ///  
 ///  
 public class mycom 
 { 
  public mycom() 
  { 
   //  
   // TODO: 在此处添加构造函数逻辑 
   // 
  } 
  public int PortNum; //1,2,3,4 
  public int BaudRate; //1200,2400,4800,9600 
  public byte ByteSize; //8 bits 
  public byte Parity; // 0-4=no,odd,even,mark,space  
  public byte StopBits; // 0,1,2 = 1, 1.5, 2  
  public int ReadTimeout; //10 
     
  //comm port win32 file handle 
  private int hComm = -1; 
     
  public bool Opened = false; 
      
  //win32 api constants 
  private const uint GENERIC_READ = 0x80000000; 
  private const uint GENERIC_WRITE = 0x40000000; 
  private const int OPEN_EXISTING = 3;   
  private const int INVALID_HANDLE_VALUE = -1; 
     
  [StructLayout(LayoutKind.Sequential)] 
   private struct DCB  
  { 
   //taken from c struct in platform sdk  
   public int DCBlength;           // sizeof(DCB)  
   public int BaudRate;            // current baud rate  
   public int fBinary;          // binary mode, no EOF check  
   public int fParity;          // enable parity checking  
   public int fOutxCtsFlow;      // CTS output flow control  
   public int fOutxDsrFlow;      // DSR output flow control  
   public int fDtrControl;       // DTR flow control type  
   public int fDsrSensitivity;   // DSR sensitivity  
   public int fTXContinueOnXoff; // XOFF continues Tx  
   public int fOutX;          // XON/XOFF out flow control  
   public int fInX;           // XON/XOFF in flow control  
   public int fErrorChar;     // enable error replacement  
   public int fNull;          // enable null stripping  
   public int fRtsControl;     // RTS flow control  
   public int fAbortOnError;   // abort on error  
   public int fDummy2;        // reserved  
   public ushort wReserved;          // not currently used  
   public ushort XonLim;             // transmit XON threshold  
   public ushort XoffLim;            // transmit XOFF threshold  
   public byte ByteSize;           // number of bits/byte, 4-8  
   public byte Parity;             // 0-4=no,odd,even,mark,space  
   public byte StopBits;           // 0,1,2 = 1, 1.5, 2  
   public char XonChar;            // Tx and Rx XON character  
   public char XoffChar;           // Tx and Rx XOFF character  
   public char ErrorChar;          // error replacement character  
   public char EofChar;            // end of input character  
   public char EvtChar;            // received event character  
   public ushort wReserved1;         // reserved; do not use  
  } 
   
  [StructLayout(LayoutKind.Sequential)] 
   private struct COMMTIMEOUTS  
  {   
   public int ReadIntervalTimeout;  
   public int ReadTotalTimeoutMultiplier;  
   public int ReadTotalTimeoutConstant;  
   public int WriteTotalTimeoutMultiplier;  
   public int WriteTotalTimeoutConstant;  
  }  
   
  [StructLayout(LayoutKind.Sequential)]  
   private struct OVERLAPPED  
  {  
   public int  Internal;  
   public int  InternalHigh;  
   public int  Offset;  
   public int  OffsetHigh;  
   public int hEvent;  
  }   
     
  [DllImport("kernel32.dll")] 
  private static extern int CreateFile( 
   string lpFileName,                         // file name 
   uint dwDesiredAccess,                      // access mode 
   int dwShareMode,                          // share mode 
   int lpSecurityAttributes, // SD 
   int dwCreationDisposition,                // how to create 
   int dwFlagsAndAttributes,                 // file attributes 
   int hTemplateFile                        // handle to template file 
   ); 
  [DllImport("kernel32.dll")] 
  private static extern bool GetCommState( 
   int hFile,  // handle to communications device 
   ref DCB lpDCB    // device-control block 
   );  
  [DllImport("kernel32.dll")] 
  private static extern bool BuildCommDCB( 
   string lpDef,  // device-control string 
   ref DCB lpDCB     // device-control block 
   ); 
  [DllImport("kernel32.dll")] 
  private static extern bool SetCommState( 
   int hFile,  // handle to communications device 
   ref DCB lpDCB    // device-control block 
   ); 
  [DllImport("kernel32.dll")] 
  private static extern bool GetCommTimeouts( 
   int hFile,                  // handle to comm device 
   ref COMMTIMEOUTS lpCommTimeouts  // time-out values 
   );  
  [DllImport("kernel32.dll")]  
  private static extern bool SetCommTimeouts( 
   int hFile,                  // handle to comm device 
   ref COMMTIMEOUTS lpCommTimeouts  // time-out values 
   ); 
  [DllImport("kernel32.dll")] 
  private static extern bool ReadFile( 
   int hFile,                // handle to file 
   byte[] lpBuffer,             // data buffer 
   int nNumberOfBytesToRead,  // number of bytes to read 
   ref int lpNumberOfBytesRead, // number of bytes read 
   ref OVERLAPPED lpOverlapped    // overlapped buffer 
   ); 
  [DllImport("kernel32.dll")]  
  private static extern bool WriteFile( 
   int hFile,                    // handle to file 
   byte[] lpBuffer,                // data buffer 
   int nNumberOfBytesToWrite,     // number of bytes to write 
   ref int lpNumberOfBytesWritten,  // number of bytes written 
   ref OVERLAPPED lpOverlapped        // overlapped buffer 
   ); 
  [DllImport("kernel32.dll")] 
  private static extern bool CloseHandle( 
   int hObject   // handle to object 
   ); 
     
  public void Open()  
  { 
      
   DCB dcbCommPort = new DCB(); 
   COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();  
      
      
   // OPEN THE COMM PORT. 
   
       
   hComm = CreateFile("COM" + PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0); 
     
   // IF THE PORT CANNOT BE OPENED, BAIL OUT. 
   if(hComm == INVALID_HANDLE_VALUE)  
   { 
    throw(new ApplicationException("Comm Port Can Not Be Opened")); 
   } 
     
   // SET THE COMM TIMEOUTS. 
      
   GetCommTimeouts(hComm,ref ctoCommPort); 
   ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout; 
   ctoCommPort.ReadTotalTimeoutMultiplier = 0; 
   ctoCommPort.WriteTotalTimeoutMultiplier = 0; 
   ctoCommPort.WriteTotalTimeoutConstant = 0;   
   SetCommTimeouts(hComm,ref ctoCommPort); 
     
   // SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS. 
   // THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST. 
   // IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER 
   // THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING. 
   // ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING. 
     
   dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort); 
   GetCommState(hComm, ref dcbCommPort); 
   dcbCommPort.BaudRate=BaudRate; 
   dcbCommPort.Parity=Parity; 
   dcbCommPort.ByteSize=ByteSize; 
   dcbCommPort.StopBits=StopBits; 
   SetCommState(hComm, ref dcbCommPort); 
       
   Opened = true; 
       
  } 
     
  public void Close()  
  { 
   if (hComm!=INVALID_HANDLE_VALUE)  
   { 
    CloseHandle(hComm); 
                Opened=false; 
   } 
  } 
     
  public byte[] Read(int NumBytes)  
  { 
   byte[] BufBytes; 
   byte[] OutBytes; 
   BufBytes = new byte[NumBytes]; 
   if (hComm!=INVALID_HANDLE_VALUE)  
   { 
    OVERLAPPED ovlCommPort = new OVERLAPPED(); 
    int BytesRead=0; 
    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort); 
    OutBytes = new byte[BytesRead]; 
    Array.Copy(BufBytes,OutBytes,BytesRead); 
   }  
   else  
   { 
    throw(new ApplicationException("Comm Port Not Open")); 
   } 
   return OutBytes; 
  } 
     
  public int Write(byte[] WriteBytes)  
  { 
   int BytesWritten = 0; 
   if (hComm!=INVALID_HANDLE_VALUE)  
   { 
    OVERLAPPED ovlCommPort = new OVERLAPPED(); 
    WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort); 
   } 
   else  
   { 
    throw(new ApplicationException("Comm Port Not Open")); 
   }   
   return BytesWritten; 
  } 
 } 
}

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

136

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

122

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

35

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

121

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号