解决方案 »
- 新手请教:vs2010打包哪些需要?
- 找错
- 自定义控件 如何实现设计时,双击事件,自动添加代码?
- 保存图片路径到sql05中:网上找了很长时间、弄了快一星期了,还是没弄好,请各位好心人进来帮帮,谢谢了
- 标示符报错
- 一浏览器显示标题的问题?
- 我在网上找到了一个产生MD5号的VB程序,运行后得到一个码:698D51A19D8A121CE581499D7B701668。我不明白的是这个串如何使用。比如我编写
- 如何知道我自己机子的ip呢?急!
- 求助 回车焦点切换的问题
- 请问一下版主!!!
- WINFORM 怎么把imagelist的图片显示在listview
- 急!100分!C#调用C++动态库,求高手帮忙!
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为 返回的是温度信息 不会变化很大
你真正要用的话,open和write也是必然要分开的,不可能每发一次数据,就开关一次串口吧
open和write 也是分开的 不会 发送一次 打开一次
Thread.Sleep(500) 时间设置长一点看看
sp.WriteTimeout = 1000; 这个没有用,不要设置
设置
sp.ReadTimeout=-1;读取数据永不超时
COM2,2400,8,E,1
SerialPort对于奇偶校验设置,是没有BUG的.其他代码也没看出有什么问题.
按我说的,设置一下sp.ReadTimeout=-1试试.咱俩代码只有这里不一样了.
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");
}
SerialPort确实有些BUG,比如我在WINPE上调试时,某些PCI插槽的串口无法识别
同样的发送指令 使用串口调试工具 接收的数据时正确的 只有7位长度 并且 前3为 一定是固定的 01 04 04
但是 使用 写的程序 接收数据时 会出现长度不同 数据也不一样 接受的数据中 会有很多3F
上面 Console控制台 接收的数据 都是有问题的
现在的问题是,你还没有搞清楚,到底是因为你发送出去的数据错乱,导致设备反馈数据异常
还是接收的时候数据错乱.
API 类 去哪里下载
API 类 去哪里下载
API类,电脑里就有,直接调用就行了.
你只需要查找:串口API,网上有现成代码可以COPY.
你需要知道的只是如何调用
用 串口调试工具 接收的数据 根据协议计算 是正确的数据 但是 我使用SerialPort接收道德数据 根据协议计算 确定 是错误数据
你确认你这个转换?
你可以看下字节数组转16进制字符串的实现
同样用BitConverter.ToString()
为毛发送字节中间是空格隔开,而接收字节是 - 隔开?怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果
BitConverter.ToString()只是为了 把接收的数据 显示在 控制台 看看接收的是什么 没实际意义