串口RS-232发送代码问题
情况:一个“商业软件”有向串口发送和接收数据(或指令)的功能,所以可以利用它控制其它任何外设RS232设备,但是发送的只能是字符串型的代码,无法选择发送十六进制代码。不幸...
情况:
一个“商业软件”有向串口发送和接收数据(或指令)的功能,所以可以利用它控制其它任何外设RS232设备,但是发送的只能是字符串型的代码,无法选择发送十六进制代码。
不幸的是有一个RS232设备只能识别十六进制代码。
问题:
如果我要用这个“商业软件”控制这个设备,怎么实现?
具体的说就是,怎么把“55 01 01 02 01 00 00 5a”这个十六进制代码以字符串(ascii)形式发送,但是下位机接收的还是十六进制?
不胜感激!!! 展开
一个“商业软件”有向串口发送和接收数据(或指令)的功能,所以可以利用它控制其它任何外设RS232设备,但是发送的只能是字符串型的代码,无法选择发送十六进制代码。
不幸的是有一个RS232设备只能识别十六进制代码。
问题:
如果我要用这个“商业软件”控制这个设备,怎么实现?
具体的说就是,怎么把“55 01 01 02 01 00 00 5a”这个十六进制代码以字符串(ascii)形式发送,但是下位机接收的还是十六进制?
不胜感激!!! 展开
展开全部
“商业软件”串口发送和接收数据,发送的只能是字符串型的代码,设备要收十六进制代码
答案:
1、分析
发送字符串型,实际是一个一个字符发送的,设备也是一个一个十六进制代码接受的。
应此,如果设备端要接收“55 01 01 02 01”这样5个字节的十六进制代码,软件端发送可以这样,
例如发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
不幸的是如果要发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,由于里面含有十六进制00(即0x00),0x00字符表示是'\0',在字符串中表示的字符串结束。
看你运气了,如果程序的源代码中发送字符串模块,发送字符长度是通过判断字符串长度(strlen)来工作的,那你怎么也发送不出“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,从上看出
buff[5]=0x00;buff[6]=0x00;buff[7]=0x5a;时,你的软件会认为字符串长度只有5。只会发送出“55 01 01 02 01”这样5个字节的十六进制代码。如果你的软件发送字符长度是根据你输入或设定的,那能正常发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码。
例如发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x5a;
2、解决办法(不该源代码的情况下)
做个中间件,需要用到PC的多个串口通道(串口不够用多串口卡扩展),系统接线也要调整,如果是1对1(一套软件对一个设备)
例如:软件是用com1口发送接收,原来是直接com1口接设备,现在改成,com1口接com2口,com2口同时也接设备(注意RS232是可以三线通讯的,PC端com1口的2脚接com2口的3脚,com2口的3脚接设备的2脚,PC端com1口的3脚接com2口的2脚,com2口的2脚接设备的3脚,PC端com1口的5脚接com2口的5脚,接设备的5脚),这样做的原理是通过com2口来正确发送给设备十六进制代码。并且com1向com2发送的命令需要修改。例如
要发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,软件这端
发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
buff[5]=0xee;
buff[6]=0xff;
buff[7]=0xee;
buff[8]=0xff;
buff[9]=0x5a;
com2口中间件收到“55 01 01 02 01 ee ff ee ff 5a”这样10个字节的十六进制代码,他就会进行转换(0xee表示下个字节需要转码,转码方法是减去0xff,那0xff实际就是0x00。)这样通过中间件在com2口向设备发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码。
以上是发送,如果接收呢,同样看商业软件的接受机制,如果商业软件收到0x00,实际就是'\0',表示一个字符串接受终止,那么接收数据怎么整都不能正常收到“55 02 01 02 01 00 00 5a”这样8个字节的十六进制代码(含0x00),那么只有改写源代码一种方法。
3、后记
如果你的所谓商业软件要求别人改源代码不切实际,而且商业软件也不复杂,可以找人重写商业软件了,现在做软件外快的人太多了,拿公司软件稍微改改,时间用不了多少,费用也不高,几千吧
答案:
1、分析
发送字符串型,实际是一个一个字符发送的,设备也是一个一个十六进制代码接受的。
应此,如果设备端要接收“55 01 01 02 01”这样5个字节的十六进制代码,软件端发送可以这样,
例如发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
不幸的是如果要发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,由于里面含有十六进制00(即0x00),0x00字符表示是'\0',在字符串中表示的字符串结束。
看你运气了,如果程序的源代码中发送字符串模块,发送字符长度是通过判断字符串长度(strlen)来工作的,那你怎么也发送不出“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,从上看出
buff[5]=0x00;buff[6]=0x00;buff[7]=0x5a;时,你的软件会认为字符串长度只有5。只会发送出“55 01 01 02 01”这样5个字节的十六进制代码。如果你的软件发送字符长度是根据你输入或设定的,那能正常发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码。
例如发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x5a;
2、解决办法(不该源代码的情况下)
做个中间件,需要用到PC的多个串口通道(串口不够用多串口卡扩展),系统接线也要调整,如果是1对1(一套软件对一个设备)
例如:软件是用com1口发送接收,原来是直接com1口接设备,现在改成,com1口接com2口,com2口同时也接设备(注意RS232是可以三线通讯的,PC端com1口的2脚接com2口的3脚,com2口的3脚接设备的2脚,PC端com1口的3脚接com2口的2脚,com2口的2脚接设备的3脚,PC端com1口的5脚接com2口的5脚,接设备的5脚),这样做的原理是通过com2口来正确发送给设备十六进制代码。并且com1向com2发送的命令需要修改。例如
要发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码,软件这端
发送字符串变量是buff:
char *buff[10];
buff[0]=0x55;
buff[1]=0x01;
buff[2]=0x01;
buff[3]=0x02;
buff[4]=0x01;
buff[5]=0xee;
buff[6]=0xff;
buff[7]=0xee;
buff[8]=0xff;
buff[9]=0x5a;
com2口中间件收到“55 01 01 02 01 ee ff ee ff 5a”这样10个字节的十六进制代码,他就会进行转换(0xee表示下个字节需要转码,转码方法是减去0xff,那0xff实际就是0x00。)这样通过中间件在com2口向设备发送“55 01 01 02 01 00 00 5a”这样8个字节的十六进制代码。
以上是发送,如果接收呢,同样看商业软件的接受机制,如果商业软件收到0x00,实际就是'\0',表示一个字符串接受终止,那么接收数据怎么整都不能正常收到“55 02 01 02 01 00 00 5a”这样8个字节的十六进制代码(含0x00),那么只有改写源代码一种方法。
3、后记
如果你的所谓商业软件要求别人改源代码不切实际,而且商业软件也不复杂,可以找人重写商业软件了,现在做软件外快的人太多了,拿公司软件稍微改改,时间用不了多少,费用也不高,几千吧
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询