首页 新闻 会员 周边 捐助

大神们请指导 C#读取串口发送接收命令帧 谢谢

0
悬赏园豆:30 [已解决问题] 解决于 2014-09-10 11:46

大版主你好
    请教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);//读取缓冲数据

求指点

卢格的主页 卢格 | 初学一级 | 园豆:5
提问于:2014-08-20 20:01
< >
分享
最佳答案
0

十几年不写单片机了,都忘记了。

给你个建议:

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,此处不赘述

    }

}

收获园豆:20
519740105 | 大侠五级 |园豆:5810 | 2014-08-21 09:02

几天时间都不一定搞出来,唉

卢格 | 园豆:5 (初学一级) | 2014-08-21 09:51

@卢格: ???

519740105 | 园豆:5810 (大侠五级) | 2014-08-21 09:54
其他回答(4)
0

byte0-8按正常数值,byte[9]是一种校验,算法的一种,来效验前面的字节,你可以BAIDU下CRC8的C#代码,自己写还是算了吧太多的位运算了

56180825 | 园豆:1749 (小虾三级) | 2014-08-20 20:20
0

找找《串口通讯开发指南》这本书看看,

LiuKaiFa | 园豆:1491 (小虾三级) | 2014-08-20 22:00
0

一般发送的都是字符串,最好是ascii码,不要发中文,写一个方法生成校验码,和校验校验码的

一个字符串就是一个byte数组了。你直接发了就有了

收获园豆:10
吴瑞祥 | 园豆:29449 (高人七级) | 2014-08-21 07:02
0

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);

读数据的时候建议一个字节一个字节读取,有时候返回的命令分成两次接收的

贪心狸猫 | 园豆:872 (小虾三级) | 2014-08-21 09:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册