c#串口通信(控制台程序)
本文介绍的是利用控制台进行串口通信,网上有很多的文章都是使用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进账的数据,有空再补充