通讯编码问题求教 点击:1235 | 回复:18



cuiying_beijing

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-22 09:08:00
楼主
各位大虾:我使用89c52单片机,想把一16位的数据(高位放在R0低位放在R1中),通过串口发送给PC,我想应该先把该数据变成ASCII码吧,然后发送出去,不知道怎么搞?? 多多帮忙啊



GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-03-22 11:26:00
1楼
您可能误会 ASCII 的用法了! 举例来说, 若要传送 ABC 这三个字符, 则我们会将其转成 ASCII 的 0x41, 0x42, 0x43 , 再传送出去, 对方收到 0x41, 0x42, 0x43 时就可以对照 ASCII 查知是 ABC 这三个字符. 若要传送 0x4142 这个数据, 则直接送出 0x42, 0x41 即可, 对方收到时再组回 0x4142 这个数据. 当然, 0x41 是要当成 ASCII 还是当成数据... 这就要看两边的定义了. 只要两边达成协议, 该转则转, 该组则组即可. 也就是说, 数据是否要先转成 ASCII 码, 或如何转, 这都要看双方的协议.

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-22 16:18:00
2楼
首先要谢谢GaryLin的帮助,我上位机程序是用VC编写的,用串口调试器对程序进行了测试发现,当串口调试器以16进制发送“37”时,则我的程序收到的是十进制的“7”,说明中间有16进制与十进制的转换(编码采用的是ASCII码)。那么如果我要用单片机发送“1100110011001100”该数据,我是不是就要在单片机中把该数据变成ASCII,然后发送出去。不知道我理解的是否对?如果要在单片机中转换,那么该如何转化呢?

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-22 16:37:00
3楼
比如我要发送“11111111”,该数值为十进制的255,我是不是要在单片机的三个内存单元中分别按16进制存放“32”、“35”、“35”然后依次发送给主机PC呢?但是怎么在单片机中进行这样的转换呢?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-03-24 15:36:00
4楼
很难理解哦! 发送 0x37; 收到 7 所以, 发送 0x32, 0x35, 0x35; 收到 2, 5, 5 三个数据(不是 255)

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-25 08:19:00
5楼
对,收到的是2,5,5三个数据,我对这三个数据是这样处理的: 我把这三个数据赋值给一个字符串,然后再用atof()函数处理就能得到整数255这个值了。 因为是多机通讯,发送的数据是跟其他的字符一起发送的,其他的字符要用ASCII码,那么是不是这种数据也要用ASCII码呢?比如按modbus协议要先发送":",那么":"就是按ASCII发送的,如果下面的数据不按ASCII发送,我不知道该怎么处理哦

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-03-25 12:29:00
6楼
多机通讯, 状况会特别杂乱. 要避免在 bus 上同时有两个(或更多的) device 作出回应(Send), 不然, 信息在 bus 上会打架! 在 bus 上能传送的数据, 一般都是 8-bit, 也就是 0x00 ~ 0xFF. 不论您是否要按 ASCII 去发送, 最终都得转成 0x00 ~ 0xFF.

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-25 15:47:00
7楼
是噢,打架的问题我会解决的。但是,比如说我单片机发送 0x37,则用我现行的程序可以判断收到的是十进制的“7”,然而如果单片机发送的是0xFF,判定收到的是十进制的“0”,不知怎么搞? 在PC一方该怎么处理收到的0xFF,让他变成“255”呢? 谢谢GaryLin的回复!!谢谢!!

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-03-25 17:56:00
8楼
您之前不是有答案了吗? 要让 PC 收到的数据转出的结果是 255, 就得送出 0x32, 0x35, 0x35 三个字符. 0xFF(255) 转成字符串, 也就是了!

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-25 18:32:00
9楼
对哦,但是我不知道在单片机中怎么把“0xFF”转成“255”,也就是怎么把“255”分成三个字符"2""5""5"发送出去,问题就在这儿呢。您再帮帮忙吧!!谢谢

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-28 16:25:00
10楼
我又仔细阅读了英文的MODBUS协议,我认为我应该把“11111111”变成ASCII的"A""A"传送,这样在VC里面也可以处理了。但是好像还是没有现成的函数把"A""A"处理得到256,要自己编程,对吗?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-03-30 10:25:00
11楼
单片机我不清楚, 在 VC 里用 sprintf(szBuf, "%d", 0xFF); 即可将 0xFF 转为 "255" 三个字符.若系统本身就是用 ASCII 的话, 那您直接送出 "2", 就等于是送出 0x32.也就是说, 系统会帮您作一些简单的转换.

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-03-30 14:17:00
12楼
好的,谢谢您了

幻想强大

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 30回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2005年3月15日
发表于:2005-03-31 15:37:00
13楼
对这个问题我怎么没有碰到,我用VC++和MODEM与PLC通讯,我直接就可以得到我要的数据,你用的是那个控件吗?如果是我们可以详细交流下我们的做法,是不是你绕弯路了,我怎么感觉没有那么复杂,,,, 我的fromthere_yong@163.com

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-04-01 09:30:00
14楼
很高兴您有兴趣探讨这个串口通讯的问题,我想您在论坛里所说的控件可能是指VC中串口通讯的控件吧,我不是用的这个控件,我用的是一个免费的类CSerialPort。通讯的协议是用标准的MODBUS协议。我用的是ASCII码模式,在这个模式中所发送的字符只能是‘0-9’与‘A-F’。所以需要发送的数据都要进行转化,比如’1111 1111’就要转化为字符’F’’F’发送。上面所说的字符就是ASCII所对应的字符。 不知道我的理解是否正确,谢谢指点!

荷塘鹤舞

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 10回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2002年7月01日
发表于:2005-04-07 09:23:00
15楼
最好收发双方都以二进制进行处理,即BINARY模式。 将所有的数据都变换为十六进制后传送,以BYTE数据类型接收,就不会存在"如果单片机发送的是0xFF,判定收到的是十进制的'0'"的问题了。因我不久前也遇过相似的情况,以ASCII码模式是无法正常对ASCII码为128~255间的字符进行传输。

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-04-10 15:52:00
16楼
噢,这个问题时这样的255要用两个ASCII表示即'F''F',用二进制就是'01001111''01001111',一个ASCII是不能表示128---255的

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2005-04-11 10:21:00
17楼
ASCII 可以表示 0 ~ 255 (0xFF), 但 Modbus 的 ASCII 模式只有使用其中的 '0'(0x30) ~ '9' (0x39) 及 'A'(0x41) ~ 'F'(0x46) 这 16 个字符, 另加一个 ':' 起始字符, 以及 CR, LF. 而 RTU 模式下, 则是 binary 0 ~ 255 (0xFF) 都可用. 'F'(0x46), 'F'(0x46) 的二进制应该是 0100 0110, 0100 0110.

cuiying_beijing

  • 精华:0帖
  • 求助:0帖
  • 帖子:37帖 | 62回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2004年9月24日
发表于:2005-04-12 10:47:00
18楼
哦,对对,谢谢GaryLin,那个是我的笔误 我程序是跟您说的一样用的

热门招聘
相关主题

官方公众号

智造工程师