C#串行通信(数据包的打包与解包)
//单片机或者其他设备将要发送的数据进行打包处理
void pack_dat(unsigned char dat)
{
rf_buf[0]=10;//设定ID号(协议头)
rf_buf[1]=chang_sig;//序列号(或者其他相关信息)
rf_buf[3]=rf_buf[0]^rf_buf[1];
rf_buf[2]=dat;//数据
rf_buf[3]^=rf_buf[3];//前三个数的异或(校验位)
}
//C#上位机程序接收函数
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;//防止出现所谓的“线程”错误
int bytes = serialPort1.BytesToRead;//buffer中数据的长度
byte[] buffer = new byte[bytes];//定义一个长度为bytes的字节数组
serialPort1.Read(buffer, 0, bytes); //读取buffer中的数据
for (i = 0; i < bytes; i++)
{
Dispose(buffer[i]);
}
}
//将接收到的数据进行处理,提取协议头
private void Dispose_Battery(int n)
{
Init_Arry[3] = Init_Arry[2];
Init_Arry[2] = Init_Arry[1];
Init_Arry[1] = Init_Arry[0];
Init_Arry[0] = n;
if(Init_Arry[3] ==10)//协议头 ID:
{
unpack_dat();
}
……
//解包过程
void unpack_dat()
{
if(rf_buf[3]==(rf_buf[0]^rf_buf[1]^rf_buf[2]))
{
//相关处理函数
}
}
tuzhuke
2010-12-12
http://duanfei12340.blog.163.com/blog/static/12039714320101112101236372/