1.通讯格式
其中
通讯地址为1~247
功能码
CRC校验码
CRC-16,低位在前,高位在后
报文格式
1.读单个或多个寄存器
发送单帧数据格式:地址+功能码+读寄存器的首个地址+读取寄存器个数+CRC校验码
接受单帧数据格式:地址+功能码+字节长度+单/多数据+CRC校验码
#每个寄存器占用两个字节
2.写单个寄存器
寄存器地址定义
//采集数据定时器事件
private void timer5_FreshData_Tick(object sender, EventArgs e)
{
if (serialPort1.IsOpen)//判断串口开启情况
{
try
{
//定义8字节数组
byte[] Data = new byte[8] { 0x01, 0x03, 0x9C, 0x41, 0x00, 0x02, 0x00, 0x00 };
//插入CRC
UInt16 CRC = Crc_Check(Data, 6);//计算前6个字节CRC
byte CRC_H = (byte)(CRC >> 8);
byte CRC_L = (byte)(CRC);
Data[6] = CRC_L;
Data[7] = CRC_H;
//发送
serialPort1.Write(Data, 0, 8);//从第0个字节开始发送到第8个字节
//添加发送时间
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "发 ->");
//遍历显示
foreach (byte Member in Data)
{
string str = Convert.ToString(Member, 16).ToUpper();
textBox1.AppendText((str.Length == 1 ? "0" + str : str) + " ");
}
textBox1.AppendText("\r\n");
}
//发送失败,关闭串口
catch
{
serialPort1.Close();
button2.BackgroundImage = Properties.Resources.Image_CloseSerial;
button2.Tag = "OFF";
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
textBox1.AppendText("采集命令发送失败!\r\n");
timer1.Stop();//关闭串口工具异常检测
}
}
}