一、起始
最近在公司做上位机,上位机要求是能够读取一款支持串口通信的传感器并且把传感器的数据用图表显示出来,且上位机能对传感器发送指令,需求有涉及到串口通信和绘制图表。
那么首先要解决的问题就是能够让电脑上的程序进行串口通信,有串口通信的编程语言有很多,C++,C#,JAVA,Python等语言都是支持串口通信的。我选择了使用C#,因为上位机主要是在Windows操作系统上运行,而C#对于winodws桌面应用的开发支持是比较方便的,功能也比较强大,尤其是WPF程序,做出来的UI页面比较好看
那么本篇内容就介绍c#程序怎么实现串口通信
二、工具准备
开发工具:Visual Studio 2019 Community
开发工具下载:免费的 IDE 和开发人员工具 | Visual Studio Community
维特智能姿态角度传感器JY901模块*1
USB-TLL模块*1、杜邦线*1
三、新建项目
1.新建项目,选择WPF应用程序,你可能会发现两个
WPF 桌面模板,一个用于 .NET Framework,另一个用于 .NET Core。 .NET Core 模板在 Visual
Studio 2019 16.3 及更高版本中可用。 你可以在本教程中使用任何一个,但建议使用 .NET Core 进行新的开发。
2.在下一屏幕中指定“项目名称”和选择“项目路径”,然后点击“创建”
四、添加串口通信引用
1.右击项目解决方案“管理NuGet程序包”,搜索“Ports”关键字,添加System.IO.Ports引用。System.IO.Ports包是.Net 2.0以来集成的免费的串口通信包,
五、建立串口通信工具类
创建SerialPortUtils工具类,为了后面能够方便的操作串口我们先实现一个串口操作的工具类,串口通信中用到最多的操作就是“搜索串口”,”打开/关闭串口“,”接收数据“,“发送数据”,我们可以先实现以上操作的方法。
搜索串口实现,搜索串口可以直接调用SerialPort类的GetPortNames方法,该方法会返回一个串口名称的string数组。
打开关闭串口实现,这里传入“串口名称”和“波特率”参数打开串口,如果有需要其他参数可以修改方法参数。打开串口后把ReceiveData做为接收事件的委托。
接收串口数据的委托方法实现,sender对象为串口对象,接收数据后直接向控制台打印数据
发送数据实现,检查串口是否打开,然后向串口发送数据并且打印到控制台,这样一个简单的串口通信工具类就实现了
六、SerialPortUtils工具类完整代码
public class SerialPortUtils{
public static string[] GetPortNames(){
returnSerialPort.GetPortNames();
}
public static SerialPortSerialPort=null;
public static SerialPort OpenClosePort(stringcomName,intbaud){
//串口未打开
if(SerialPort==null||!SerialPort.IsOpen){
SerialPort=newSerialPort();//串口名称SerialPort.PortName=comName;//波特率SerialPort.BaudRate=baud;//数据位SerialPort.DataBits=8;//停止位SerialPort.StopBits=StopBits.One;//校验位SerialPort.Parity=Parity.None;//打开串口SerialPort.Open();//串口数据接收事件实现SerialPort.DataReceived+=newSerialDataReceivedEventHandler(ReceiveData);returnSerialPort;
}//串口已经打开else{
SerialPort.Close();return SerialPort;
}}
public static void ReceiveData(objectsender,SerialDataReceivedEventArgse){
SerialPort _SerialPort=(SerialPort)sender;int_bytesToRead=_SerialPort.BytesToRead;byte[]recvData=newbyte[_bytesToRead];_SerialPort.Read(recvData,0,_bytesToRead);//向控制台打印数据Debug.WriteLine("收到数据:"+recvData);
}
public static bool SendData(byte[]data){
if(SerialPort!=null&&SerialPort.IsOpen){
SerialPort.Write(data,0,data.Length);
Debug.WriteLine("发送数据:"+data);
returntrue;
}
else{
return false;
}
}
}
七、工具类收发数据演示
JY901连接我的电脑是COM3
测试方法,在MainWindow创建testSerialPortUtils方法,testSerialPortUtils方法先搜索一遍串口,打印所有串口的名称;然后打开COM3,向COM3发送一条指令
调试输出结果
COM3
发送数据:System.Byte[]
收到数据:System.Byte[]
收到数据:System.Byte[]
收到数据:System.Byte[]
收到数据:System.Byte[]
收到数据:System.Byte[]
调试后发现输出的数据是一个Byte数组,是的在串口开发中收到的数据都是byte形式的,在串口开发过程中经常会遇到byte数据和二进制、十进制、十六进制的数据。下一篇“C#十六进制、十进制、二进制、字符串数据互转”将详细介绍串口开发中用到的数据装换
八、结语
再为大家介绍一个优秀的C#开源串口助手项目
码云OSDA开源串口助手项目地址:Leven/OSDA
感谢阅读本篇“C# SerialPort连接串口,读取串口数据”,本篇到此结束,下一篇“C#十六进制、十进制、二进制、字符串数据互转”