解决方案 »

  1.   

    串口 波特率  检验 什么都是正确的  请求的指令也是正确的   用串口调试工具  发送 同样的指令 返回的数据时正确的  况且 返回的数据 不会是63 
    01 04 04 00 4F 00 4E 4A 67          01 04 04 00 4F 00 4E 4A 67      01 04 04 00 4F 00 4E 4A 67           01 04 04 00 4F 00 4E 4A 67     01 04 04 00 4F 00 4E 4A 67          01 04 04 00 50 00 4E 7B A1      01 04 04 00 4F 00 4E 4A 67           01 04 04 00 50 00 4E 7B A1     01 04 04 00 4F 00 4E 4A 67          01 04 04 00 4F 00 4E 4A 67      01 04 04 00 4F 00 4E 4A 67           01 04 04 00 4F 00 4E 4A 67      01 04 04 00 4F 00 4E 4A 67          01 04 04 00 4F 00 4E 4A 67       01 04 04 00 4F 00 4E 4A 67          01 04 04 00 4F 00 4D 0A 66       01 04 04 00 4F 00 4D 0A 66           01 04 04 00 4F 00 4D 0A 66 
    这是 使用串口 调试工具测试 返回的数据 除了 最后2为 校验码 会变化比较大外  第4-7为 返回的是温度信息 不会变化很大
      

  2.   

    sp.Open(); 之后,不要马上发送数据,而是先等待一下,然后清空串口缓冲区,再发送,试试.
    你真正要用的话,open和write也是必然要分开的,不可能每发一次数据,就开关一次串口吧
      

  3.   

    open后 我是Thread.Sleep(500) 然后才开始write 
    open和write  也是分开的  不会 发送一次 打开一次
      

  4.   

    serialport会有串码的问题,需要自己验证返回数据格式,建议还是用c++或者直接调用windows api比较好。
      

  5.   


    Thread.Sleep(500) 时间设置长一点看看
      

  6.   

    默认情况下,SerialPort 使用 ASCIIEncoding 对字符进行编码。ASCIIEncoding 将所有大于 127 的字符编码为 (char)63 或“?”。若要支持该范围中的其他字符,请将 Encoding 设置为 UTF8Encoding、UTF32Encoding 或 UnicodeEncoding。
      

  7.   

    仔细看了一下参数,
    sp.WriteTimeout = 1000; 这个没有用,不要设置
    设置
    sp.ReadTimeout=-1;读取数据永不超时
      

  8.   

    Parity.Even这个是偶校验,你确定奇偶校验没弄错?
      

  9.   

    重复一下你的端口设置:
    COM2,2400,8,E,1
      

  10.   

    串口设置没问题   com2  2400 8  1  even  和串口调试工具一样
      

  11.   

    我打开之前做的工程看了一下,当时设置的是2400,7,E,1
    SerialPort对于奇偶校验设置,是没有BUG的.其他代码也没看出有什么问题.
    按我说的,设置一下sp.ReadTimeout=-1试试.咱俩代码只有这里不一样了.
      

  12.   

    这是我完整的代码  没见哪里错误 private static SerialPort sp = new SerialPort();
            static void Main(string[] args)
            {
                sp.PortName = "COM2";
                sp.BaudRate = 2400;
                sp.StopBits = StopBits.One;
                sp.Parity = Parity.Even;
                sp.DataBits = 8;
                sp.ReadTimeout = -1;
                Console.WriteLine("名 称:" + sp.PortName.ToString());
                Console.WriteLine("波特率:" + sp.BaudRate.ToString());
                Console.WriteLine("停止位:" + sp.StopBits.ToString());
                Console.WriteLine("校验位:" + sp.Parity.ToString());
                Console.WriteLine("数据位:" + sp.DataBits.ToString());            //byte[] request = { 1, 4, 0, 0, 0, 61, 49, 219 }; //读61个 返回长度127
                //byte[] request = { 1, 4, 0, 0, 0, 3, 176, 11 };  //读3个  返回长度11
                byte[] request = { 1, 4, 0, 0, 0, 2, 113, 203 };   //读2个  返回长度9
                Console.Write("请求指令:");
                Console.WriteLine(BitConverter.ToString(request, 0, request.Length));
                sp.Open();
                System.Threading.Thread.Sleep(500);
                sp.Write(request, 0, request.Length);
                Console.Write("响应数据:");
                sp.DiscardOutBuffer(); //清空发送缓冲区的内容
                sp.DiscardInBuffer();  //清空接收缓冲区的内容
                System.Threading.Thread.Sleep(2000);
                int readlength = sp.BytesToRead;
                byte[] response = new byte[readlength];
                sp.Read(response, 0, readlength);
                Console.Write("长度:" + readlength.ToString() + "\r\n");
                Console.Write(BitConverter.ToString(response, 0, response.Length));
                Console.Write("\r\n");      
    }    
                
      

  13.   

    如果还是实在没办法,只能换串口API了.
    SerialPort确实有些BUG,比如我在WINPE上调试时,某些PCI插槽的串口无法识别
      

  14.   

    发送的指令没错  完全根据Modbus协议生成的指令   
    同样的发送指令 使用串口调试工具 接收的数据时正确的  只有7位长度  并且 前3为 一定是固定的 01 04 04  
    但是 使用 写的程序 接收数据时  会出现长度不同   数据也不一样 接受的数据中 会有很多3F   
    上面  Console控制台 接收的数据 都是有问题的
      

  15.   

    modbus协议我清楚是怎么回事,不用解释.
    现在的问题是,你还没有搞清楚,到底是因为你发送出去的数据错乱,导致设备反馈数据异常
    还是接收的时候数据错乱.
      

  16.   

    小生遇到过!解决办法是:发送时在有效数据前后添加标志(如:EF  有效数据  FF),接收时候验证一下!
      

  17.   


    API 类 去哪里下载
      

  18.   


    API 类 去哪里下载
    API类,电脑里就有,直接调用就行了.
    你只需要查找:串口API,网上有现成代码可以COPY.
      

  19.   

    串口API,和鼠标API,键盘API一样,都是系统自带的DLL
    你需要知道的只是如何调用
      

  20.   


    用 串口调试工具 接收的数据  根据协议计算 是正确的数据  但是 我使用SerialPort接收道德数据 根据协议计算  确定 是错误数据
      

  21.   

    缓存区 也清空了  使用API    SerialPort.Read()     SerialPort.BaseStream.BeginRead()  三证方法 都不能得到正确数据
      

  22.   

    楼主的modbus设备返回数据方式,是属于主机查询设置数量方式,还是设备主动返回数量方式,如果是属于后者的,应该给串口添加DataReceived事件,在事件处理方法读取设置数据,而不是睡眠一定时间再读取设置数据
      

  23.   

    BitConverter.ToString(response, 0, response.Length)
    你确认你这个转换?
    你可以看下字节数组转16进制字符串的实现
      

  24.   

    在发送之前清空,不是在 write 方法呼叫之后在清空。
      

  25.   

    又仔细看了一下,你确定你发的是完整代码??
    同样用BitConverter.ToString()
    为毛发送字节中间是空格隔开,而接收字节是 - 隔开?怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果
      

  26.   


    BitConverter.ToString()只是为了 把接收的数据 显示在 控制台 看看接收的是什么 没实际意义