最近公司在做一个化工厂项目,用到了昆仑天晨的XST数据采集仪表,我们的上位机软件要通过485通讯从仪表中读取测量值,可我按照说明书里的方法,用串口助手给仪表发命令,可读回来的数据有50%以上是误码。他们的说明书是这样写的
读取主测量值:
例1 命令:#01¿
回答:=+123.5A¿
本命令读取地址为01的单输入通道数显仪的测量值。
回答表明测量值为+123.5,第1报警点处于报警状态。
可是我们用串口助手发“#01”再加个回车,读回来的数据就是有错误。 昨天去他们公司理论,找到他们开发人员,他们直接在串口助手里发16进制的数 23 30 31 0D 读回来的数据很正常,没有一点错误。 后来拿发“#01”再加个回车,现象也是一样的,结果也是好多错误。
那会我明白了,这是为什么。 肯定是串口助手多发一个字符。 今天早上,来到公司,用两电脑互相发一下数据,只发一个回车,接收端用16进制显示,结果显示0D 0A 也就是说串口助手以ASCII码形式发送回车时,实际上发的是发的是回车符"\r" 0D和换行符"\n" 0A 问题就出在这。
可见他们做的产品通用性很差。台达变频器,也用的ASCII码通讯,但不存在这个问题,随便用什么串口助手发,通讯都没问题。区别就在于,台达的结束符,是两个“\r\n”,而这个昆仑天晨的XST数据采集仪表,结束符只有一个“\r”,恰恰你有串口助手里以ASCII码形式敲一个回车时,它会认为成两个字各个字符“\r\n”。问题就出在这。
看来,以后我们做485通讯时,一定要考虑到这点,一定要做得兼容性做得更好!!
附:
转义符 C语言的:
转义字符是C语言中表示字符的一种特殊形式。通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '),用于表示字符串常量的双撇号( ")和反斜杠( \)等。转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。
转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) 008
\f 换页(FF) 012
\n 换行(LF) 010 0A
\r 回车(CR) 013 0D
\t 水平制表(HT) 009
\v 垂直制表(VT) 011
\\ 反斜杠 092
\? 问号字符 063
\' 单引号字符 039
\" 双引号字符 034
\0 空字符(NULL) 000
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制
字符常量中使用单引号和反斜杠以及字符常量中使用双引号和反斜杠时,都必须使用转义字符表示,即在这些字符前加上反斜杠。
在C程序中使用转义字符\ d d d或者\ x h h可以方便灵活地表示任意字符。\ d d d为斜杠后面跟三位八进制数,该三位八进制数的值即为对应的八进制A S C I I码值。\ x后面跟两位十六进制数,该两位十六进制数为对应字符的十六进制A S C I I码值。
使用转义字符时需要注意以下问题:
1) 转义字符中只能使用小写字母,每个转义字符只能看作一个字符。
2) \v 垂直制表和\f 换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
3) 在C程序中,使用不可打印字符时,通常用转义字符表示
阅读(1723) | 评论(0) | 转发(0) |