以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  通信协议请教  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=79348)

--  作者:ljh29206
--  发布时间:2015/12/29 14:46:00
--  通信协议请教
采用RS485 MODBUS RTU标准通讯

,说明如下

    2、数字量输入信号采集命令:

    

 发送:01 02 00 00 00 08 79 CC (例/16进制)

数据

字节

数据说明

备注

01

1

模块地址

地址范围01-FE

02

1

功能码

02-读取输入位

0000

2

输入地址(1x型)

0000-输入位起始地址

0008

2

读取输入位长度

0008-读取8个输入位

79CC

2

CRC校验码

前面所有数据的CRC校验码

 

 接收:01 02 01 C2 20 19(例/16进制)

数据

字节

数据说明

备注

01

1

模块地址

地址范围01-FE

02

1

功能码

02-读取输入位

01

1

字节数

01-读取1个字节长度

C2 

1

读取数据

C2-读取输入位状态

2019

2

CRC校验码

前面所有数据的CRC校验码

 

读取的数据“C2”,转换成2进制数为“11000010”,从左至右分别对应8路数字量输入信号DI_08-DI_01的状态,即DI_08、DI_07、DI_02有输入,其它通道无输入


项目打开后写入

Ports.Add("COM15")
With
Ports("COM15")
    .Close()
    .Parity = Parity.None
    .Handshake = Handshake.None
    .StopBits = StopBits.One
    .BaudRate =
9600
    .DataBits =
8
    .Open

End
With

 窗体 计时器写入

 Ports("COM15").Write("01 02 00 00 00 08 79 CC ")

Dim s1 As String  = Ports("COM15").ReadExisting()

Dim s2 As String

s2 = s1.Replace("g","").Trim()

e.Form.Controls("TextBox1").text = s2

e.Form.Controls("Label1").text = s2


不能读出数值,求指点


--  作者:大红袍
--  发布时间:2015/12/29 15:24:00
--  
Dim Val() As Byte = New Byte(){&H01,&H02,&H00,&H00,&H00,&H08,&H79,&HCC}
Ports("COM15").Write(Val, 0, Val.Length)

--  作者:ljh29206
--  发布时间:2015/12/29 15:33:00
--  
袍哥
图片点击可在新窗口打开查看此主题相关图片如下:无标题.png
图片点击可在新窗口打开查看
请看 读数 出现报错
这个是不是不能正常读取?


--  作者:大红袍
--  发布时间:2015/12/29 15:48:00
--  

Com15是不是正确的端口啊?哪有这么大的。确定你连接的哪一个,然后add哪一个

 

Ports.Add("COM3")

 

-----------------

 

Dim Val() As Byte = New Byte(){&H01,&H02,&H00,&H00,&H00,&H08,&H79,&HCC}
Ports("COM3").Write(Val, 0, Val.Length)


--  作者:ljh29206
--  发布时间:2015/12/29 15:53:00
--  
确定没错的,  只有1个COM口

可以读了 读出来的数据是 “    

”`H “ 

这个东西
此主题相关图片如下:无标题.png
按此在新窗口浏览图片

此主题相关图片如下:无标题.png
按此在新窗口浏览图片


[此贴子已经被作者于2015/12/29 15:59:27编辑过]

--  作者:大红袍
--  发布时间:2015/12/29 15:55:00
--  

确认一下你的端口号

 

 

http://www.foxtable.com/help/topics/2419.htm

 


--  作者:ljh29206
--  发布时间:2015/12/29 15:58:00
--  
老师请看上贴 ,可以读了, 但读出来的乱码!
--  作者:大红袍
--  发布时间:2015/12/29 16:11:00
--  

读字节这样处理

 

Dim cnt As Integer = Ports("COM1").BytesToRead
If cnt > 0 Then \'缓冲区是否有数据
    Dim rval(cnt - 1) As Byte
    Ports("COM1").Read(rval,0,cnt)
    Dim str As String = BitConverter.ToString(rval).Replace("-", " ") 
    msgbox(str)

End If


--  作者:ljh29206
--  发布时间:2015/12/29 17:07:00
--  
OK了 多谢袍哥指点

最后问下

1:MessageBox.Show(Ports("COM15").ReadExisting())
读出来 乱码
2:
Dim cnt As Integer = Ports("COM15").BytesToRead
If cnt > 0 Then \'缓冲区是否有数据
    Dim rval(cnt - 1) As Byte
    Ports("COM15").Read(rval,0,cnt)
    Dim str As String = BitConverter.ToString(rval).Replace("-", " ")  
    msgbox(str)
End If
以上就正确

为什么 要用2的方式读书呢  ,为什么 1的方式 读不出数据来?

--  作者:大红袍
--  发布时间:2015/12/29 17:10:00
--  

1、你可以设置一下字符,用ReadExisting应该也可以

 

http://www.foxtable.com/help/topics/1980.htm

 

2、否则,直接用字节收发

 

http://www.foxtable.com/help/topics/1979.htm