|
|
导航: |
论坛 -> 网络通讯
斑竹:liumazi,sephil |
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 9:31:19 |
标题: |
为什么nrcomm无法发送高位为1的16进制字符? |
浏览:2604 |
|
加入我的收藏 |
楼主: |
使用nrComm dataprocessor 发送和接收数据,在一台电脑上测试,短接了串口的rx和tx,使用memo作为nrcomm的terminal,nrcomm设置为115200bps,parity=none,stopbits=1,streamprotocol=none,bytesize=8。 nrDataProcessor1.DataPackets[0].PacketBegin:=#$5A; nrDataProcessor1.DataPackets[0].Packetend:=#$FE; nrDataProcessor1.DataPackets[0].Active:=True; 采用如下命令发送: mystr:=#$5A#$31#$80#$32#$33#$34#$FE#$EF; if nrComm1.Active then nrComm1.SendString(mystr) else ShowMessage('serial not open');
send:5A 31 32 33 34 FE EF recv:5A 31 32 33 34 C3 BE C3 AF
send:5A 31 80 32 33 34 FE EF recv:5A 31 C2 80 32 33 34 C3 BE C3 AF
请高人指点,谢谢
----------------------------------------------
- |
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 10:47:21 |
1楼: |
send:5A A5 0A 00 05 C2 00 D0 FE EF recv:5A 3F 05 3F C3 90 C3 BE 3F
难道编码问题?
----------------------------------------------
-
|
作者: |
|
2021/1/1 10:52:40 |
2楼: |
都要发二进制数据了,为啥还用sendString,SendData不香么?
----------------------------------------------
-
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 15:47:00 |
3楼: |
mystr:pansichar; mystr:=#$5A#$31#$80#$32#$33#$34#$FE#$EF; if nrComm1.Active then //nrComm1.SendString(mystr) nrComm1.SendData(mystr,10)
5A 31 80 32 33 34 FE EF recv:5A 31 C2 80 32 33 34 C3 BE C3 AF
更奇怪了,水平有限,请指教。
----------------------------------------------
-
|
作者: |
|
2021/1/1 16:00:00 |
4楼: |
看起来一切正常的样子,楼主说的问题在哪里?
----------------------------------------------
-
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 16:47:50 |
5楼: |
我认为发送的,要和接收的字符是一样的吧。但现在从结果来看,不一样。 发送的:5A 31 80 32 33 34 FE EF 接收的:5A 31 C2 80 32 33 34 C3 BE C3 AF
不知道是怎么回事?请指教
----------------------------------------------
-
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 16:50:27 |
6楼: |
还有一个问题,为什么收到数据了,dataprocessor还报 timeout?
----------------------------------------------
-
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/1 22:12:59 |
7楼: |
必须用 array of byte 来发送,就没有问题。但是为什么dataprocessor 还是报 timeout,就不知道了。
----------------------------------------------
-
|
作者: |
|
2021/1/1 23:05:44 |
8楼: |
mystr:pansichar; 改为 mystr: ansistring; 或者 mystr:rawbytestring;
----------------------------------------------
-
|
作者: |
tiez (骑牛夜旅) |
★☆☆☆☆ |
-
|
普通会员 |
|
2021/1/2 10:25:33 |
9楼: |
使用COM发送数据,最好用tbytes或array of byte做数据的承载体,无必要不要使用字符串了,因为不小心字符串就会在unicode、长度判断等地方处理出错。8楼建议的rawbytestring也是个选择,这个类型在内部引用是不会被自动处理,可保证值的原始性。 nrcomm这个控件是没问题的,使用很久了。 使用时要注意几个问题,AfterReceive收到包之后放缓冲里拼接,查到包尾之后移出马上触发其它线程来处理。二是流控要搞清楚原理。
----------------------------------------------
-
|
作者: |
zhhzm (Redbreast) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/2 20:04:01 |
10楼: |
去掉流控看看
----------------------------------------------
菩提有树无树,明镜是台非台,关我鸡毛鸟事,坐看云去云来。
|
作者: |
sxbug (太阳雨) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2021/1/2 21:07:11 |
11楼: |
感谢大家的帮助。我使用 array of byte 已经能用。其它方法暂时没有测试。但厂家的人也按我的要求做了一个程序。看界面 用了sendstring,效果是对的。
我看他是用ansistring做的
流控我是去掉的
----------------------------------------------
-
|
作者: |
|
2021/1/2 21:52:16 |
12楼: |
一点不奇怪,你用 mystr:pansichar; 这是一个指针,它指向哪里了??mystr:=#$5A#$31#$80#$32#$33#$34#$FE#$EF; 这样直接给指针赋值,你的程序没有报AV就不错了。但是这样写,报AV是迟早的事!
----------------------------------------------
-
|
|