本文介绍的是利用控制台进行串口通信,网上有很多的文章都是使用winform来介绍串口通信,有些文章并没有给出winform的UI界面,这需要我们去猜那个控件对于的代码了,这相当于费脑子。这是基于这个原因,我利用控制台程序讲解串口通信的大概流程,有什么不对的地方,请多多指教。
由于我在同一台PC机上测试并且我手头上没有串口线,不然我可以利用COM线把PC机上的COM1口和COM2口接起来的,没办法,故在编程之前,需要做的工作是,把PC机的COM1口2号引脚和3号引脚短接起来,用小铁丝短接即可,放心,不会电死人的,我试过了。
由于一台PC机上的一个COM口只能绑定一个SerialPort类,故发送数据和接收数据的方法都封装在一个类中,废话少说,直接上完整的代码。
using System; using System.Collections.Generic; using System.IO.Ports; //需要引入的命名空间 using System.Text; using System.Data; using System.Xml; namespace 串口通信发送和接收端 { class Program { static void Main(string[] args) { SerialPortTest port = new SerialPortTest(); port.Send(); //发送数据 port.Close(); //关闭COM口 } } public class SerialPortTest { SerialPort port; public SerialPortTest() { //指定COM1口,根据情况也可以指定COM2口 port = new SerialPort("COM1"); //指定波特率 port.BaudRate = 9600; try { //打开COM口 port.Open(); //接收数据 Receieve(); } catch (Exception) { Console.WriteLine("打开COM口失败"); } } //接收数据 private void Receieve() { //接收到数据就会触发port_DataReceived方法 port.DataReceived += port_DataReceived; } void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { //存储接收的字符串 string strReceive = string.Empty; if (port != null) { //读取接收到的字节长度 int n = port.BytesToRead; //定义字节存储器数组 byte[] byteReceive = new byte[n]; //接收的字节存入字节存储器数组 port.Read(byteReceive, 0, n); //把接收的的字节数组转成字符串 strReceive = Encoding.UTF8.GetString(byteReceive); Console.WriteLine("接收到的数据是: " + strReceive); } } //发送数据 public void Send() { //从控制台获取输入的字符串 Console.WriteLine("请输入字符串:"); string strRead = Console.ReadLine(); //当输入不是q时,就一直等到输入并发送 while (strRead != "q") { //去掉输入字符串的前后空格 strRead = strRead.Trim(); if (!strRead.Equals("")) { //串口发送数据 port.WriteLine(strRead); } Console.WriteLine("请输入字符串:"); strRead = Console.ReadLine(); } } //关闭COM口 public void Close() { if(port!=null&&port.IsOpen){ port.Close(); port.Dispose(); } } } }
其实最重要的是SerialPort类,先取得实例对象,然后指定要使用哪个COM口和通信的波特率,接着打开COM口,这时紧接着调用接收数据的方法,等待数据发来;再接着调用发送数据的方法,最后关闭COM口和释放资源。
运行效果图如下:
但是,如果发送的字符串过于长,方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)会自动调用多次,如下图:
看到了吗?第三次发的是zhangxiangyu,但接收到的方法void port_DataReceived(object sender, SerialDataReceivedEventArgs e)自动调用两次,那么接收端如何获取完整的字符串呢?可以使用字符串拼接。
好了,这就完成了,会的大牛勿喷!!!
待补充:
不单可以发送和接收字符串类型的数据,也可以发送和接收16进账的数据,有空再补充