好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#基于WinForm实现串口通讯

串口通讯是一种计算机常用的数据传输方式。

程序运行如下:

首先,检查计算机的串口,并获取所有串口信息。

private void CheckPort()//检查串口是否可用 ? ? ? ? { ? ? ? ? ? ? myLog(2, "检测串口开始!"); ?//log记录函数 ? ? ? ? ? ? comboBox1.Items.Clear();//清除控件中的当前值 ? ? ? ?? ? ? ? ? ? ? string[] a = SerialPort.GetPortNames(); ? ? ? ? ? ? if (a.Length != 0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? for (int i = 0; i < a.Length; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? comboBox1.Items.Add(a[i]); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? comboBox1.SelectedIndex = 0;//?? ? ? ? ? ? ? ? ? myLog(2, "检测串口完成"); ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? myLog(2, "无可用串口...", true); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? private void SetPort()//设置串口 ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? serialPort1.PortName = comboBox1.Text.Trim();//串口名给了串口类 ? ? ? ? ? ? ? ? //波特率 ? 虚拟串口的波特率好像不能修改,但得将其赋为空,不然报错 ? ? ? ?? ? ? ? ? ? ? ? ? // serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text.ToString().Trim()); ? ? ? ? ? ? ? ? ? ? ? ? // 9600; ? ? ? ? ? ? ? ? serialPort1.BaudRate = Convert.ToInt32("".Trim()); ? ? ? ? ? ? ? ? //奇偶效验 ? ? ? ? ? ? ? ? if (comboBox5.Text.Trim() == "奇校验") ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.Parity = Parity.Odd;//将奇校验位给了sp的协议 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if (comboBox5.Text.Trim() == "偶校验") ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.Parity = Parity.Even; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.Parity = Parity.None; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //停止位 ? ? ? ? ? ? ? ? if (comboBox4.Text.Trim() == "1.5") ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.StopBits = StopBits.OnePointFive;//设置停止位有几位 ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if (comboBox4.Text.Trim() == "2") ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.StopBits = StopBits.Two; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? serialPort1.StopBits = StopBits.One; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? serialPort1.DataBits = Convert.ToInt16(comboBox3.Text.ToString().Trim());//数据位 ? ? ? ? ? ? ? ? serialPort1.Encoding = Encoding.UTF8;//串口通信的编码格式 ? ? ? ? ? ? ? ? serialPort1.Open(); ? ? ? ? ? ? } ? ? ? ? ? ? catch { } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// Log记录 ? ? ? ? /// </summary> ? ? ? ? /// <param name="aa">aa= ?0为发送 ?1为接受 2为日常记录</param> ? ? ? ? /// <param name="mystr">记录内容</param> ? ? ? ? /// <param name="IsHint">true 显示弹框,false 不显示弹框 默认false</param> ? ? ? ? private void myLog(int aa, string mystr, bool IsHint = false) ? ? ? ? { ? ? ? ? ? ? //log存放路径 ? ? ? ? ? ? string myypath = myPath + DateTime.Now.ToString("yyyyMMdd") + ".txt"; ? ? ? ? ? ? StreamWriter sw = new StreamWriter(myypath, true); ? ? ? ? ? ? string tempSendstr; ? ? ? ? ? ? if (aa == 0) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " ?" + serialPort1.PortName + " 发送--->>> ?" + mystr; ? ? ? ? ? ? } ? ? ? ? ? ? else if (aa == 1) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " ?" + serialPort1.PortName + " 接收<<<--- ?" + mystr; ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + " ?" + mystr; ? ? ? ? ? ? } ? ? ? ? ? ? sw.WriteLine(tempSendstr); ? ? ? ? ? ? sw.Close(); ? ? ? ? ? ? //弹框提示 ? ? ? ? ? ? if (IsHint) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MessageBox.Show(mystr, "提示"); ? ? ? ? ? ? } ? ? ? ? ? ? if (listBox1.Items.Count >= 10) listBox1.Items.Clear(); ? ? ? ? ? ? listBox1.Items.Add(tempSendstr); ? ? ? ? }

大部分的笔记本都不带串口的,我们可以在网上下载 Configure Virtual Serial Port Driver,给自己的笔记本添加几对虚拟串口(虚拟串口都是成对且一一匹配的),再用串口调试助手就可以进行调试了。

数据的发送:

?//发送 private void button3_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if(!serialPort1.IsOpen) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? MessageBox.Show("串口未打开,请检查!"); ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? } ? ? ? ? ? ? string mystr1 = textBox1.Text; ? ? ? ? ? ? byte[] a = Encoding.UTF8.GetBytes(mystr1); ? ? ? ? ? ? string mystr2 = Encoding.UTF8.GetString(a); ? ? ? ? ? ? serialPort1.Write(mystr2);//将数据写入串行端口输出缓冲区 ? ? ? ? ? ? myLog(0, mystr2); ? ? ? ? }

数据接收:

//串口接收数据 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) ? ? ? ? { ? ? ? ? ? ? Thread.Sleep(100); ? ? ? ? ? ? this.Invoke((EventHandler)(delegate //异步委托一个线程 ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (serialPort1.BytesToRead > 0) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? byte[] a = new byte[serialPort1.BytesToRead];//读出缓冲区串口通信的字节 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int readbytes = 0; ? ? ? ? ? ? ? ? ? ? while (serialPort1.Read(a, readbytes, serialPort1.BytesToRead - readbytes) <= 0) ; ? ? ? ? ? ? ? ? ? ? string str = UTF8Encoding.UTF8.GetString(a); ? ? ? ? ? ? ? ? ? ? textBox2.Text = str + "\r\n"; ? ? ? ? ? ? ? ? ? ? myLog(1, str); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? })); ? ? ? ? }

这是串口之间字符串的发送与接收,如要进行十六进制的传输,只需要在数据发送和接收时将字符串转化成十六进制,再写进缓冲区或读取。

多条信息发送时,可能会出现下面的情况。

串口调试助手将三次发送的数据一起读出来了,此时我们只需要在发送时给上一定的延时即可。

这样就能实现串口多条信息的发送与接收了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

查看更多关于C#基于WinForm实现串口通讯的详细内容...

  阅读:56次