概述
首先我们得先知道串口发来的数据是什么样子的:
例如:
55 AA 02 04 01 02 03 04 05 0F
我们看一下上面的例子
数据头: 55 AA 02
有效数据位:04 有效数据位的意思是,从这个字符往后数多少位。是他的有效数据
代表数值:01 02 03 04 05
代表校验码:0F
首先我们需要准备一个串口对象
// 我们需要有一个串口
SerialPort ser = new SerIalPort();
// 设置端口基本信息
PortName = "COM2";
BaudRate = 57600;
DataBits = 8;
Handshake = Handshake.None;
StopBits = StopBits.One;
ReadTimeout = -1;
ser.DtrEnable = true;
ser.Parity = Parity.None;
// 打开串口端口
ser.open(); // 这里只做一个比较 该有try/catch还是要加上
给串口发送信息,接下来。串口会给上位机发送一些指令
public int sendMsg(String str){
// 判断一下端口是否被关闭
if (!ser.IsOpen) {
return 0; // 代表端口已被开启
}
// 去除传输来的String字符串
str = str.Replace(" ", "");
// 保证字符串能够整除2
if(str.Length % 2 != 0) {
str += " ";
}
// 准备数组
byte[] value = new byte[str.Length / 2];
// 为数组赋值
for (int i = 0; i < value.Length; i++){
value[i] = Convert.ToByte(str.Substring(i * 2, 2).Replace(" ", ""),16);
}
// 发送数据
ser.Write(value, 0, value.Length);
return 1;
}
发送完命令以后。串口设备会给上位机发送一连串的他的命令
// 在接收数据之前。我们需要绑定串口读取事件
// 例如我在load事件中接收
private void Form1_Load(object sender, EventArgs e){
// 刚刚在上面定义了一个打开端口的方法
this.openPort(); // 假设他开启成功
ser.DataReceived += GetData; // 在后面生成一个接收事件方法
}
// 准备一个队列(作为缓冲数据)
Queue<byte> resultBytes = new Queue<byte>();
// 接收事件方法
private void GetData(object sender, SerialDataReceivedEventArgs e){
// 读取他准备接收的条目数
byte[] result = new byte[ser.BytesToRead];
// 开始读取数据
ser.Read(result, 0, result.Length);
// 把数据存入队列
for (int i = 0; i < result.Length; i++){
resultBytes.Enqueue(result[i]);
}
// 解析步骤
while(resultBytes.Count >= 10){ // 这里的10.意思是你接收到的完整数据
// 开始解析数据头
if(resultBytes.Dequeue() == 0x55
&& resultBytes.Dequeue() == 0xAA
&& resultBytes.Dequeue() == 0x02){
// 最后的结果
byte[] resultArray = new byte[resultBytes.Dequeue()];
for(int i = 0 ; i < resultArray.Length;i++){
// 没拿到一个数据就存入结果集中
resultArray[i] = resultBytes.Dequeue();
}
// 数据读取完了。 ResultArray就是最后的值集合
}
}
}
本人小菜。本篇博客只是作为个人记录。。如果对各位有帮助。那最好。。。如果无用。轻喷。谢谢
最后
以上就是饱满方盒为你收集整理的C#串口通信-----------解析串口发来数据的全部内容,希望文章能够帮你解决C#串口通信-----------解析串口发来数据所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复