用SerialPort发送十六进制数的问题!
用VisualStudio2005里的vb编写串口通讯程序。怎么将文本框里的内容按16进制发送出去?比如文本框里输入:01162D3F需要在串口调试助手里按十六进制接收的...
用Visual Studio 2005里的vb编写串口通讯程序。怎么将文本框里的内容按16进制发送出去?
比如文本框里输入:01 16 2D 3F
需要在串口调试助手里按十六进制接收的方式收到01 16 2D 3F。
希望做个这方面的高手指点一二。
另:我的程序已经可以正确的接收和发送文本格式的数据(即String类型)。比如发送:a b c 1 2 3,串口调试助手不以16进制接收(注意:是不以16进制接收)时,正确接收a b c 1 2 3;但是,要是串口调试助手以16进制接收,就会接收到:61 62 63 31 32 33。(转换成10进制后正好是abc123的ASCII码97 98 99 49 50 51)。
史诩:你说的对,但是我现在就是不能将文本框里的数据正确转换成Byte()数组。所以我的问题其实是等效于:怎么将文本框里的数据正确转换成Byte()数组,而文本框并不限制数据的输入长度,大小。
三根鞋带:你好!谢谢你的回答。你的方法能将textbox里的数据正确转换成Byte型,但是发送的时候还是以ASCII发。
比如:TextBox1.Text = 0123
用Dim str As String = TextBox1.Text '条件不为空
Dim b() As Byte = System.Text.Encoding.Default.GetBytes(str)
之后,b()={0,1,2,3}
其实我要实现的是将文本框里输入的数转换成如下格式:
b()={&H01, &H23}
呵呵,这样才会正确的以16进制发送出去。
请问怎么实现?
PS:我刚接触VB2005,要是用VB6做这方面的话会简单很多。
真诚感谢你的帮助! 展开
比如文本框里输入:01 16 2D 3F
需要在串口调试助手里按十六进制接收的方式收到01 16 2D 3F。
希望做个这方面的高手指点一二。
另:我的程序已经可以正确的接收和发送文本格式的数据(即String类型)。比如发送:a b c 1 2 3,串口调试助手不以16进制接收(注意:是不以16进制接收)时,正确接收a b c 1 2 3;但是,要是串口调试助手以16进制接收,就会接收到:61 62 63 31 32 33。(转换成10进制后正好是abc123的ASCII码97 98 99 49 50 51)。
史诩:你说的对,但是我现在就是不能将文本框里的数据正确转换成Byte()数组。所以我的问题其实是等效于:怎么将文本框里的数据正确转换成Byte()数组,而文本框并不限制数据的输入长度,大小。
三根鞋带:你好!谢谢你的回答。你的方法能将textbox里的数据正确转换成Byte型,但是发送的时候还是以ASCII发。
比如:TextBox1.Text = 0123
用Dim str As String = TextBox1.Text '条件不为空
Dim b() As Byte = System.Text.Encoding.Default.GetBytes(str)
之后,b()={0,1,2,3}
其实我要实现的是将文本框里输入的数转换成如下格式:
b()={&H01, &H23}
呵呵,这样才会正确的以16进制发送出去。
请问怎么实现?
PS:我刚接触VB2005,要是用VB6做这方面的话会简单很多。
真诚感谢你的帮助! 展开
2个回答
展开全部
串口传输数据都是以byte形式的,我是使用C#的,在C#里面不管需要发送什么数据最后都是把其字符串形式转化为byte的数组.
我觉得在vb里面应该是一样的.
所以不管你发送的是什么,你可以选择的只是编码的类型.就是你是以ASCII编码,还是UTF7,UTF8等等.然后把你要传输的数据以该编码的方式转化为byte[].然后再将byte[]写入到串口的流中. 接收的时候也是一样的,其实接受到的是byte流,可以看做是byte数组.你可以选择的是你用什么编码方式来解码这个byte数组.
我没有使用过串口助手,不过通过你的描述,我理解串口助手里面的16进制接受只是把接受到的byte数组的每一个byte以16进制表示方式显示出来而已.
关于把文本框里的内容转化为byte数组:
我能提供在c#里的做法.如果您的文本内容包含中文或者其他不在ASCII码中的字符我建议您使用UTF8编码方式编码.
string message="Hello!";
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(message);
上面是实现的一种方式,而且您不用考虑message中有多少个字符.
在VB中可能是相似的.您可以尝试.
关于以16进制形式发送
byte类型的数据范围是0 到 255,转化成16进制&H0到&HFF是这样吗?上面我已经说过,无论您发送什么都是以byte数组的形式发送的.如果您想发送"0123"要是Ascii编码方式,那么对应的byte数组是b()={48,49,50,51}.你说是{1,2,3,4}是不对的.
48对应16进制数是30,49对应的是31,50对应的是32,51对应的是33.
如果您是想发送&H30这样的16进制数字,您只能把它看作是字符串"&H30"来发送.
这个地方你难道是想发送"&H30&H31&H32&H33"这个字符串吗?还是"30313233"这个字符串?
string message="&H30&H31&H32&H33";
或者
string message="30313233";
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(message);
我觉得在vb里面应该是一样的.
所以不管你发送的是什么,你可以选择的只是编码的类型.就是你是以ASCII编码,还是UTF7,UTF8等等.然后把你要传输的数据以该编码的方式转化为byte[].然后再将byte[]写入到串口的流中. 接收的时候也是一样的,其实接受到的是byte流,可以看做是byte数组.你可以选择的是你用什么编码方式来解码这个byte数组.
我没有使用过串口助手,不过通过你的描述,我理解串口助手里面的16进制接受只是把接受到的byte数组的每一个byte以16进制表示方式显示出来而已.
关于把文本框里的内容转化为byte数组:
我能提供在c#里的做法.如果您的文本内容包含中文或者其他不在ASCII码中的字符我建议您使用UTF8编码方式编码.
string message="Hello!";
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(message);
上面是实现的一种方式,而且您不用考虑message中有多少个字符.
在VB中可能是相似的.您可以尝试.
关于以16进制形式发送
byte类型的数据范围是0 到 255,转化成16进制&H0到&HFF是这样吗?上面我已经说过,无论您发送什么都是以byte数组的形式发送的.如果您想发送"0123"要是Ascii编码方式,那么对应的byte数组是b()={48,49,50,51}.你说是{1,2,3,4}是不对的.
48对应16进制数是30,49对应的是31,50对应的是32,51对应的是33.
如果您是想发送&H30这样的16进制数字,您只能把它看作是字符串"&H30"来发送.
这个地方你难道是想发送"&H30&H31&H32&H33"这个字符串吗?还是"30313233"这个字符串?
string message="&H30&H31&H32&H33";
或者
string message="30313233";
byte[] bytes=System.Text.Encoding.UTF8.GetBytes(message);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询