以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]rs232串口发送字节问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=109071) |
||||
-- 作者:YDS -- 发布时间:2017/11/3 15:50:00 -- [求助]rs232串口发送字节问题
1、 接口形式 a)接口类型:RS232 b)传输协议:波特率19200bps、8位数据位、1位停止位、无校验 c) 采用二进制码;多字节数据传送时,低字节在前、高字节在后 2、发送的通信协议如下 发送按钮代码如下 If e.form.Controls("sd").Enabled = False Then Dim s,s2,s3 As String s = DecToBin(e.form.Controls("sd").text) If s.Length > 8 Then s2 = s.SubString(s.Length-8) s3 = s.SubString(0,s.Length-8) Else s2 = 0 s3 = s End If Dim v2,v3 As Integer v2 = BinToDec(s2) v3 = BinToDec(s3) Dim Val() As Byte = New Byte() {235,144,v2,v3,v2,v3,v2,v3,0,0} If Ports.Contains(vars("com")) = True Then Ports(vars("com")).close() Ports(vars("com")).open() Ports(vars("com")).Write(Val, 0, Val.Length) End If e.form.Controls("sd").Enabled = True e.form.Controls("sd").text = "" Else msgbox("请先对输入时转速进行确认,谢谢合作!",64,"温馨提示") End If 为什么会不成功呢? [此贴子已经被作者于2017/11/3 15:51:42编辑过]
|
||||
-- 作者:YDS -- 发布时间:2017/11/3 17:12:00 -- 周末人这么少啊 |
||||
-- 作者:有点甜 -- 发布时间:2017/11/3 17:33:00 -- 1、报什么错?
2、生成的数据是否正确?
Dim Val() As Byte = New Byte() {235,144,v2,v3,v2,v3,v2,v3,0,0} msgbox(val(2)) msgbox(val(3)) msgbox(val(4))
[此贴子已经被作者于2017/11/3 17:32:56编辑过]
|
||||
-- 作者:YDS -- 发布时间:2017/11/4 7:47:00 -- 我输入的转速是1500 Dim Val() As Byte = New Byte() {235,144,v2,v3,v2,v3,v2,v3,0,0}
msgbox(val(2)) msgbox(val(3)) 弹出的对话框是 220 5 数据是准确的,我现在怀疑是不是最后一个字节不对 校验和是怎么算的? |
||||
-- 作者:有点蓝 -- 发布时间:2017/11/4 9:04:00 -- 这个要看接口说明了,1楼的图片不就有算法吗 |
||||
-- 作者:YDS -- 发布时间:2017/11/4 9:39:00 -- .NET Framework 版本:2.0.50727.8669 Foxtable 版本:2017.10.26.1 错误所在事件:串口监视器,DataReceived 详细错误信息: 索引超出范围。必须为非负值并小于集合大小。 参数名: startIndex
|
||||
-- 作者:有点蓝 -- 发布时间:2017/11/4 9:45:00 -- 使用数组的时候,索引超过数组的长度了。 错误所在事件:串口监视器,DataReceived
|
||||
-- 作者:YDS -- 发布时间:2017/11/4 9:48:00 -- \'AC200控制器串口读取数据代码 Select Case e.Port.PortName Case vars("com") Dim cnt As Integer = e.Port.BytesToRead If cnt = 10 Then \'缓冲区是否有数据 Dim Val(cnt - 1) As Byte e.Port.Read(val,0,cnt) Dim xy As Decimal If val(0) = 235 And val(1) = 144 Then Dim mb,dq As object mb = DecToBin(val(3)) & DecToBin(val(2)) dq = DecToBin(val(5)) & DecToBin(val(4)) If forms("主窗口").opened Then Select Case val(7) Case 1 Forms("主窗口").Controls("zt").text = "减小桨距" Case 2 Forms("主窗口").Controls("zt").text = "增大桨距" Case 3 Forms("主窗口").Controls("zt").text = "顺桨增大桨距" Case 4 Forms("主窗口").Controls("zt").text = "无转速信号" Case 5 Forms("主窗口").Controls("zt").text = "已到最小桨距" Case 6 Forms("主窗口").Controls("zt").text = "已到最大桨距" Case 7 Forms("主窗口").Controls("zt").text = "顺桨桨距限制" Case 8 Forms("主窗口").Controls("zt").text = "无法低于最小桨距" Case 9 Forms("主窗口").Controls("zt").text = "无法超过最大桨距" Case 10 Forms("主窗口").Controls("zt").text = "无法超过顺桨桨距限制" Case 11 Forms("主窗口").Controls("zt").text = "启动反桨模式(反桨选项步骤一)" Case 12 Forms("主窗口").Controls("zt").text = "低于最小桨距(反桨选项)" Case 13 Forms("主窗口").Controls("zt").text = "超过最大桨距(顺桨选项)" Case 14 Forms("主窗口").Controls("zt").text = "减小桨距时过电流" Case 15 Forms("主窗口").Controls("zt").text = "增大桨距时过电流" Case 16 Forms("主窗口").Controls("zt").text = "增大顺桨桨距时过电流" Case 17 Forms("主窗口").Controls("zt").text = "开路故障" Case 18 Forms("主窗口").Controls("zt").text = "控制器软件错误" Case Else Forms("主窗口").Controls("zt").text = "无定义" End Select If val(6) > 30 Then Forms("主窗口").Controls("ms").text = "手动" Else Forms("主窗口").Controls("ms").text = "自动" End If Select Case val(6) Case 17,33 Forms("主窗口").Controls("jd").text = "起飞" Case 18,34 Forms("主窗口").Controls("jd").text = "爬升" Case 19,35 Forms("主窗口").Controls("jd").text = "巡航" Case 20,36 Forms("主窗口").Controls("jd").text = "恒速" Case 21,37 Forms("主窗口").Controls("jd").text = "顺桨" Case Else Forms("主窗口").Controls("jd").text = "无定义" End Select Forms("主窗口").Controls("sj").text = BinToDec(dq) Forms("主窗口").Controls("ys").text = BinToDec(mb) End If If vars("k") = 1 Then Dim dr As DataRow = DataTables("原始数据").addnew() dr("时间") = Date.now dr("COM") = vars("com") dr("cnt") = cnt For i As Integer = 0 To cnt - 1 If dr.Isnull("val") Then dr("val") = DecToBin(val(i)) Else dr("val") = dr("val") & "-" & DecToBin(val(i)) End If If dr.Isnull("v10") Then dr("v10") = val(i) Else dr("v10") = dr("v10") & "-" & val(i) End If If dr.Isnull("v16") Then dr("v16") = DecToHex(val(i)) Else dr("v16") = dr("v16") & "-" & DecToHex(val(i)) End If Next Dim r As DataRow = DataTables("采集数据").AddNew() r("时间") = dr("时间") r("目标转速") = BinToDec(mb) r("当前转速") = BinToDec(dq) r("档位状态") = val(6) r("实时状态") = val(7) End If End If End If End Select
|
||||
-- 作者:有点蓝 -- 发布时间:2017/11/4 9:50:00 -- 调试技巧:http://www.foxtable.com/webhelp/scr/1485.htm 看是那一句代码出错
|
||||
-- 作者:YDS -- 发布时间:2017/11/4 9:58:00 -- \'AC200控制器串口读取数据代码 Select Case e.Port.PortName Case vars("com") Dim cnt As Integer = e.Port.BytesToRead If cnt = 10 Then \'缓冲区是否有数据 Dim Val(cnt - 1) As Byte e.Port.Read(val,0,cnt) Dim xy As Decimal msgbox(0) xy = val(0)+val(2)+val(3)+val(4)+val(5)+val(6)+val(7)+val(8)+val(9) xy = xy Mod 256 msgbox(xy) |