关于C#串口通讯问题!
2017-07-09 09:43
776 查看
之前在网上看到大神用C#写了一个串口调试助手,自己也试了一下,就是发送的时候是对的(我设置的是16进制),但是接收到的和用串口程序接收到的不一样(我也是想接收16进制的数)请大神帮助看下~
[img=http://img.bbs.csdn.net/upload/201707/09/1499563146_195881.jpg][/img][img=http://img.bbs.csdn.net/upload/201707/09/1499563184_684768.png][/img]
发送A5 50时收到:
自己写的:3F3F3F3F3F3F043F3F0102C73F3FC13F839EF23FE69EF71F3F3D3F
串口调试助手的:A55A140000000424140102C7D296C1E8839EF2C0E69EF71F653D05
发送A5 52时收到:
自己写的:3F3F3F3F3F3F3F3F3F3F
串口调试助手的:A55A0300000006000000
发送A5 59时收到:
自己写的:3F3F043F3F3F15F2013F3F
串口调试助手的:A55A0400000015F201F900
[img=http://img.bbs.csdn.net/upload/201707/09/1499563146_195881.jpg][/img][img=http://img.bbs.csdn.net/upload/201707/09/1499563184_684768.png][/img]
发送A5 50时收到:
自己写的:3F3F3F3F3F3F043F3F0102C73F3FC13F839EF23FE69EF71F3F3D3F
串口调试助手的:A55A140000000424140102C7D296C1E8839EF2C0E69EF71F653D05
发送A5 52时收到:
自己写的:3F3F3F3F3F3F3F3F3F3F
串口调试助手的:A55A0300000006000000
发送A5 59时收到:
自己写的:3F3F043F3F3F15F2013F3F
串口调试助手的:A55A0400000015F201F900
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace csharp串口通讯 { public partial class Form1 : Form { SerialPort sp1; public Form1() { InitializeComponent(); this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); if (sp1 == null) { Control.CheckForIllegalCrossThreadCalls = false; //这个类中我们不检查跨线程的调用是否合法(因为.net 2.0以后加强了安全机制,,不允许在winform中直接跨线程访问控件的属性) sp1 = new SerialPort("COM8", 115200); sp1.StopBits = StopBits.One;// sp1.DataBits = 8;// sp1.Parity = Parity.Even;//设置串口属性 sp1.Open(); sp1.DataReceived += new SerialDataReceivedEventHandler(sp1_DataReceived); } } void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (sp1 != null && sp1.IsOpen) { sp1.Close(); } } ///这一部分是发送部分,即在文本框中输入内容后,点击发送按钮,里面包含把内容转化为16进制,这部分应该是对的 private void btnSend_Click(object sender, EventArgs e) { if (!sp1.IsOpen) //如果没打开 { MessageBox.Show("请先打开串口!", "Error"); return; } String strSend = txtSend.Text; //处理数字转换 string sendBuf = strSend; string sendnoNull = sendBuf.Trim(); string sendNOComma = sendnoNull.Replace(',', ' '); //去掉英文逗号 string sendNOComma1 = sendNOComma.Replace(',', ' '); //去掉中文逗号 string strSendNoComma2 = sendNOComma1.Replace("0x", ""); //去掉0x strSendNoComma2.Replace("0X", ""); //去掉0X string[] strArray = strSendNoComma2.Split(' '); int byteBufferLength = strArray.Length; for (int i = 0; i < strArray.Length; i++ ) { if (strArray[i]=="") { byteBufferLength--; } } // int temp = 0; byte[] byteBuffer = new byte[byteBufferLength]; int ii = 0; for (int i = 0; i < strArray.Length; i++) //对获取的字符做相加运算 { Byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]); int decNum = 0; if (strArray[i] == "") { //ii--; //加上此句是错误的,下面的continue以延缓了一个ii,不与i同步 continue; } else { decNum = Convert.ToInt32(strArray[i], 16); //atrArray[i] == 12时,temp == 18 } try //防止输错,使其只能输入一个字节的字符 { byteBuffer[ii] = Convert.ToByte(decNum); } catch (System.Exception ex) { MessageBox.Show("字节越界,请逐个字节输入!", "Error"); return; } ii++; } sp1.Write(byteBuffer, 0, byteBuffer.Length); } ///这部分是接收部分,即在大框中显示串口接收到的数据,可能是这一块出问题,接收解析成16进制数字时出错,对比见前面的图片!!!!! void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (sp1.IsOpen) //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了 { //输出当前时间 DateTime dt = DateTime.Now; txtReceive.Text += dt.GetDateTimeFormats('f')[0].ToString() + "\r\n"; txtReceive.SelectAll(); txtReceive.SelectionColor = Color.Blue; //改变字体的颜色 byte[] byteRead = new byte[sp1.BytesToRead]; //BytesToRead:sp1接收的字符个数 try { Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组 sp1.Read(receivedData, 0, receivedData.Length); //读取数据 //string text = sp1.Read(); //Encoding.ASCII.GetString(receivedData); sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer string strRcv = null; //int decNum = 0;//存储十进制 for (int i = 0; i < receivedData.Length; i++) //窗体显示 { strRcv += receivedData[i].ToString("X2"); //16进制显示 } txtReceive.Text += strRcv + "\r\n"; } catch (System.Exception ex) { MessageBox.Show(ex.Message, "出错提示"); txtSend.Text = ""; } } } } }
相关文章推荐
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于嵌入式linux下的串口通讯问题---回车、换行、缓冲
- 关于RS485通讯中使用STM32串口以DMA方式发送数据丢失字节的问题
- 关于C#/WPF的SerialPort类串口接受数据异常的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于Linux下用QT写的串口通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- 关于C#中实现两个应用程序消息通讯的问题
- C# 关于out和ref的问题
- 一个关于C#中一次关闭多个子窗体的问题
- 【转载】关于C#中动态加载AppDomain的问题
- 关于C#,.net 访问oracle中文乱码问题
- C#使用NMS与ActiveMQ通讯问题总结:如何持久化发布
- 关于JAVA和C#在MD5加密时不同问题的解决办法
- 关于c#在控制台应用程序中连接数据库字符串的问题