VB 串口通讯问题 扩展ASC||字符无法读取问题

iori10500 2008-10-24 09:49:39
有一个串口仪器,返回的是string形式的ASC||码,其中包括大量扩展字符
在VB中,读取出来的都是?号,请问如何解决。
读取部分代码如下,请问如何修改
MSComm1.InputMode = comInputModeText
Dim s As String
s = MSComm1.Input
目前传输过来的数据,大于127的,很多都显示成?这样用VB转换以后就成63了。
小于等于127的读取没有问题。
...全文
337 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iori10500 的回复:]
那个问题是解决了,但是现在会读丢数据了。。。。每次返回5个 16进制数,有时候前两个或者后两个就没有了是为什么啊 ?
[/Quote]
尝试在你读串口缓冲区的语句前加一个延迟等待语句,或延长等待时间,在读完数据后将inbuffercount清零。
toko828 2009-03-15
  • 打赏
  • 举报
回复
如果ASCII 码是0-31的值也没法显示出来,要用替换.
android2008 2008-11-28
  • 打赏
  • 举报
回复
ding
duyin2004 2008-11-28
  • 打赏
  • 举报
回复
按2进制方式接收,将接收的字节流转换为16进制字符串显示
数据流有两种,传送都是以字节传输的1字节8bit最大FF(即255)有的大于128的用ascii 就无法显示,
Dim bytInput() As Byte
Dim intInputLen As Integer
frmMain.ctrMSComm.InputMode = comInputModeBinary
intInputLen = frmMain.ctrMSComm.InBufferCount
ReDim bytInput(intInputLen)
bytInput = frmMain.ctrMSComm.Input
然后将bytInput里的字节数据(0-255中的值)转化成ASC||但只能显示0-128间的,128-255无法显示,
只能转化成16进制数 ,然后根据协议,进行数据摘取进行计算或再将16进制数转成ascii文本显示
转16进制如下
For n = 1 To intReceiveLen
bytInput =intValue
intHighHex = intValue \ 16
intLowHex = intValue - intHighHex * 16

If intHighHex < 10 Then
intHighHex = intHighHex + 48
Else
intHighHex = intHighHex + 55
End If
If intLowHex < 10 Then
intLowHex = intLowHex + 48
Else
intLowHex = intLowHex + 55
End If

strHex = strHex + " " + Chr$(intHighHex) + Chr$(intLowHex) + " "

If (n Mod intHexWidth) = 0 Then '设置换行
strAscii = strAscii + Chr$(13) + Chr$(10)
strHex = strHex + Chr$(13) + Chr$(10)
Else

End If
Next n
strhex 为16进制数串 然后根据协议去掉头尾,省下的根据协议算法,转成10进制数,送显示即可
zdingyun 2008-10-24
  • 打赏
  • 举报
回复
按2进制方式接收,将接收的字节流转换为16进制字符串显示
Option Explicit
Dim strData As String
Private Sub Form_Load()
Text1 = ""
MSComm1.CommPort = 1
MSComm1.InputMode = comInputModeBinary '数据通过 Input 属性以文本形式取回。
MSComm1.RThreshold = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm() '接收数据
Dim BytReceived() As Byte
Dim strBuff As String
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
Text1 = strData
'数据处理代码
End Select
End Sub
zdingyun 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iori10500 的回复:]
那个问题是解决了,但是现在会读丢数据了。。。。每次返回5个 16进制数,有时候前两个或者后两个就没有了是为什么啊 ?
[/Quote]
注意我代码中有一行
'数据处理代码
此处需依据通信协议写代码。
zdingyun 2008-10-24
  • 打赏
  • 举报
回复
那你的通信协议和数据字节长度?
iori10500 2008-10-24
  • 打赏
  • 举报
回复
那个问题是解决了,但是现在会读丢数据了。。。。每次返回5个 16进制数,有时候前两个或者后两个就没有了是为什么啊 ?
zdingyun 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iori10500 的回复:]
那个仪器是字符形式返回数据,二进制读取根本就没有用啊!
[/Quote]
LZ:
当ASCII字符值在0-32间是控制符,文本框无法显示。
而ASCII字符值大于127时,系统不带可显示字符。
按2进制接收转16进制字符形式显示,你可获得ASCII字符的值(0-255),便于分析,对00-7F的仍可转换为字符显示:
用Chr(&HXX),&HXX是16进制数
iori10500 2008-10-24
  • 打赏
  • 举报
回复
等等我试试看,误解你的意思了 ~~
iori10500 2008-10-24
  • 打赏
  • 举报
回复
那个仪器是字符形式返回数据,二进制读取根本就没有用啊!
Private Sub clear_receivetext_Click() receivetext.Text = "" End Sub Private Sub clear_sendtext_Click() sendtext.Text = "" End Sub Private Sub close_Click() MSComm1.PortOpen = False '关闭串口 End Sub Private Sub Form_Load() MSComm1.CommPort = 4 '使用串行端口1 MSComm1.Settings = "9600,N,8,1" '设置波特率等 MSComm1.InputLen = 0 '清空从接收缓存器中读到的字符 MSComm1.PortOpen = True '打开端口 '这是整个的初始化过程 End Sub Private Sub open_Click() MSComm1.CommPort = 4 '使用串行端口1 MSComm1.Settings = "9600,N,8,1" '设置波特率等 MSComm1.InputLen = 0 '清空从接收缓存器中读到的字符 MSComm1.PortOpen = True '打开端口 End Sub Private Sub receive_Click() Dim strBuff As String Dim str() As Byte strBuff = MSComm1.Input str() = strBuff '接收数据处理为16进制 For i = 0 To UBound(str) If Len(Hex(str(i))) = 1 Then strData = strData & "0" & Hex(str(i)) Else strData = strData & Hex(str(i)) End If Next receivetext.Text = LCase(strData) '转换成小写输出 'dat = MSComm1.Input ' receivetext.Text = " q" 实现将接受到的数据以文本形式写到接收部分的窗体内这是核心代码。 End Sub Private Sub send_Click() On Error Resume Next '简单的错误处理 If MSComm1.PortOpen = False Then MsgBox "串口已关闭" End If Dim a() As Byte Dim l As Integer, s As String s = sendtext.Text l = Len(s) / 2 If l = Asc("0") And test <= Asc("9") Then test = test - Asc("0") ElseIf

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧