大版主你好
请教C#接收串口数据,现在向设备发送命令帧时,不知如何定义帧内容
设备API
我的发送及读取代码
SerialPort sp1 = new SerialPort(); sp1.PortName = "COM3"; sp1.BaudRate = 9600; sp1.DataBits = 8; sp1.Parity = Parity.None; sp1.StopBits = StopBits.One; sp1.ReceivedBytesThreshold = 1; sp1.Open(); //byte[] data = Encoding.Unicode.GetBytes("10877"); //string str = Convert.ToBase64String(data); Byte[] bytes=new Byte[10]; bytes[0] = ??;//不知如何定义发送命令帧 bytes[1] = ??; bytes[2] = ??; bytes[3] = ??; bytes[4] = ??; bytes[5] = ??; bytes[6] = ??; bytes[7] = ??; bytes[8] = ??; bytes[9] = ??; sp1.Write(bytes,0,10); int n = sp1.BytesToRead; byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据 sp1.Read(buf, 0, n);//读取缓冲数据
求指点
十几年不写单片机了,都忘记了。
给你个建议:
1、定义一个枚举,描述功能
enum Function : byte
{
ReadT = 0xfe,
}
2、定义一个结构(类也可以,一般用结构的多)
struct DataStruct
{
private byte[] _datas;
public DataStruct()
{
_datas = new byte[10];
_datas[0] = 0x55;
this.SetFunction(Function.ReadT);//默认是FE命令,如果无默认命令,忽略
}
public void SetAddress(byte address)
{
_datas[1] = address;
}
public void SetFunction(Function function)
{
_datas[2] = (byte)function;
}
public byte[] GetData()
{
this.CRCData();
byte[] data = new byte[10];//最好给出克隆的数据,当然不是必须的
data.CopyTo(data);
return datas;
}
private void CRCData()
{
_data[9] = Crc();//此处用了伪码,CRC算法是公开的,也有现成的DLL,此处不赘述
}
}
几天时间都不一定搞出来,唉
@卢格: ???
byte0-8按正常数值,byte[9]是一种校验,算法的一种,来效验前面的字节,你可以BAIDU下CRC8的C#代码,自己写还是算了吧太多的位运算了
找找《串口通讯开发指南》这本书看看,
一般发送的都是字符串,最好是ascii码,不要发中文,写一个方法生成校验码,和校验校验码的
一个字符串就是一个byte数组了。你直接发了就有了
bytes[0] = ??;//不知如何定义发送命令帧
bytes[1] = 0x55;
bytes[2] = 0x01;//地址
bytes[3] = 0xFE;
bytes[4] = 0x00;//保留
bytes[5] = 0x00;
bytes[6] = 0x00;
bytes[7] = 0x00;
bytes[8] = 0x00;
bytes[9] = GetCrc8(bytes);
读数据的时候建议一个字节一个字节读取,有时候返回的命令分成两次接收的