我的C#程序和下位机用 SerialPort里通信,波特率=115200。
下位机每过500毫秒给我传输数据包, (头)EE 数据 数据 数据 数据 (尾)DD.
一个文件包的形式。我在myDataReceived函数里解析这个包,但是最后发现下位机给我发的数据,我需要很长的时间才能接收到。我是调用m_sP.ReadByte(); 按Byte一位一位解析。比如下位机每过500MS给我一个文件包,但是我接受这个包的时间是2秒。目前感觉是C#里SerialPort不能进行高速率传输,但是感觉不可能啊.. 希望高手些给点建议,
要不只有找点其他串口通信模块了。非常感谢!!! C# SerialPort 传输速率

解决方案 »

  1.   

    private void myDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    try
            {
     int SDateTemp = m_sP.ReadByte();                // 0XEE. == 238
                    if (238 == SDateTemp)
                    {
                        bStartFileHead = true;                    // 有头时,就这样设置了.直接返回
                        return;
                    }                // 0XDD == 221
                    // 处理数据并重新设置.
                    bool bCheck6 = false;
                    bool bCheck = false;                // OXDD
                    if (221 == SDateTemp)
                    {
                        // 判断到是有OXDD.
                        // 判断中间的位数有没有6位,并且bStartFileHead是打开状态.
                        bCheck6 = CheckGetData(m_tempSendList);
                        if ((true == bCheck6) && (true == bStartFileHead))
                        {
                            bCheck = true;                        // reset.
                            bStartFileHead = false;
                        }
                        else
                        {
                            // 认为发过来的数据包有问题.把缓存数据清空,并重置.
                            m_tempSendList.Clear();                        bStartFileHead = false;                    }
                    }                // 判断如果开始头没打开,则不处理数据.
                    if (true == bStartFileHead)
                    {
                        m_tempSendList.Add(SDateTemp);
                    }                // 判断是否是传回数据的值. 保存完16位再做处理.
                    // 用数据头0XEE开始 0XDD结尾
    if (true == bCheck)
    {
    // 处理数据
    }
    }        catch (Exception ex)
        {
      string strShow = ex.ToString();
                    throw ex;
    }
    }
      

  2.   

    代码里都不做判断,我直接在int SDateTemp = m_sP.ReadByte();之后把这个值和当前时间输出在文件里查看时,就发现获取一个完整的数据包需要很长的时间间隔
      

  3.   

    对了 有点忘了说 我用串口调试助手 发现这个软件可以正确的快速显示每一个文件包
    这是为什么,是因为C/C++ 编写的原因么?希望高手们推荐个串口模块之类的C++的 感谢
      

  4.   

    很明显你的代码有问题。SerialPort分异步读取跟同步读取,
    异步读取时,当数据缓冲达到SerialPort.ReceivedBytesThreshold指定的数时后台线程触发一次DataReceived,然后你通过 Read从他的缓存里读出来。怎可以像你这样,异读进去了还用同步去读。同步是直接从端口一个一个读,直到读到你设定的超时值时他抛出一个异常,或直到你要求读的数量完成。
    你这样试一下
    在初始化时设好: m_sP.ReceivedBytesThreshold=6;
    在private void myDataReceived里
      byte[] buffer=new Byte[6];
                m_sP.Read(buffer, 0, 6);
    把try去掉别的对读有关的代码都去掉,因为上面两条就从你的缓存区里把你要的数据读到buffer里了
      

  5.   

    你也可以把你的异步去掉用同步去读,比如你的下位机是500ms一次数据你就设ReadTimeout=500ms为超时
    莫认串口类没有超时的
     try
                {
                    //阻塞到读取数据或超时            
                    for (int i = 0; i <要读的数据的长度; i++)
                    {
                         buffer[i] = 串口.ReadByte();
                    }
                }
                catch (TimeoutException)
                {
    //超时处理}
      

  6.   

    和500ms没有关系,就是没有这种延时,下位机也会一直发送数据,关键时你怎么通过协议来解析接收到的数据,可以一边接受一边解析,主要是EE到DD,注意,为了防止下位机传送的数据有问题,一定要防止死锁,免得自己在解析的过程中始终没有DD出现,而出现溢出。