注册 登录
编程论坛 VB6论坛

vb串口通信波特率的问题

dull2012 发布于 2016-03-10 16:42, 6127 次点击
vb串口通信波特率的问题,设备发送出来的波特率是12800.VB编写的串口程序,无法实现12800的波特率,请大侠指点一下,使用PCOMM的API编写。另:通过自定义设置串口波特率的调试助手已经确认波特率为12800,请问怎么实现?           无法实现通信。就是下位机发送的数据,上位机无法收到。上位机编写的软件通过串口调试助手发送,又可以收到。排除了其他可能性,就时上位机软件波特率无法设置到12800造成的。你自己设置个12800,系统不认识。还是无法通信。另外,硬件使用的USB转422,支持12800波特率。

[此贴子已经被作者于2016-3-11 09:35编辑过]

9 回复
#2
dull20122016-03-10 16:42
自己先顶一下
#3
wds12016-03-10 19:42
  baud = "12800,n,8,1"
   MSComm1.Settings = baud
   检查一下设备是否有校验位,数据位数,停止位数,双方必须一致才能成功。
   上面是12800波特率,没有校验位,8位数据位,1位停止位。


[此贴子已经被作者于2016-3-10 19:44编辑过]

#4
hjxlj2016-03-11 09:30
“无法实现12800的波特率……”,怎么个无法实现?楼主没说。
#5
dull20122016-03-11 09:31
回复 3楼 wds1
你这个是MSComm,系统不支持12800,有没有像友善调试助手那样,自定义波特率设计
#6
wds12016-03-11 10:28
1、增加Combo1,Combo2控件
  Combo1:控件list定义COM1,COM2,...
  combo2:控件list定义9600,12800,...
2、设置Combo1_Click、Combo2_Click事件
  select case index
  case 0:baud="9600,n,8,1"
  case 1:baud="128600,n,8,1"
  ...
  end select
 '如果赋值语句改为baud=val(combo1.text) & ",n,8,1",支持combo1中输入波特率
3、以上可以实现列表选择或者自定义波特率



[此贴子已经被作者于2016-3-11 10:39编辑过]

#7
dull20122016-03-11 11:02
回复 6楼 wds1
你这个只是实现显示可设置波特率,具体通信不了。
#8
wds12016-03-11 12:17
  On Error GoTo ErrHandle
   If MSComm1.PortOpen = True Then MSComm1.PortOpen = False;如果端口打开,先关闭,否则发送出错
    = port
   MSComm1.Settings = baud
   MSComm1.Output = "ATE0" + Chr(13) + Chr(10)  '清回显
   MSComm1.Output = "AT+CMGF=0" + Chr(13) + Chr(10)'发短信初始化  ,你具体用什么功能,要查AT指令集
Handle:'错误判断,根据错误号可以知道发送失败原因
   Select Case Err.Number
     Case 8002: msgbox "连接错误,错误码:" + Str(Err.Number) + " 错误类型:无效端口"
     Case Else:msgbox "连接错误,错误码:" + Str(Err.Number) + " 错误类型:" + Err.Description
   End Select

Private Sub MSComm1_OnComm()'接收事件
 'comEvSend    1   在传输缓冲区中有比   Sthreshold   数少的字符。
 ' comEvReceive 2   收到   Rthreshold   个字符。该事件将持续产生直到用   Input   属性从接收缓冲区中删除数据。
 ' comEvCTS   3   Clear   To   Send   线的状态发生变化。
 ' comEvDSR   4   Data   Set   Ready   线的状态发生变化。该事件只在   DST   从   1   变到   0   时才发生。
 ' comEvCD   5   Carrier   Detect   线的状态发生变化。
 ' comEvRing   6   检测到振铃信号。一些   UART(通用异步接收—   传输)可能不支持该事件。
 ' comEvEOF   7   收到文件结束(ASCII   字符为   26)字符。
  Select Case '处理接收事件
   case comEvReceive
    If = comEvReceive Then
      MSComm1.InputLen = MSComm1.InBufferCount
  On Error GoTo ErrHandle1
      ReceiveData = MSComm1.Input
      ReceiveData = ReceiveData + MSComm1.Input
    endif
    j = InStr(ReceiveData, "+CMS")
    If j > 0 Then  ReceiveSuccess = 0
    i = InStr(ReceiveData, "+CMGR:")
    j = InStr(ReceiveData, "+CMGS")
    If j = 0 And i = 0 And Len(ReceiveData) > 8 Then '删除接收区中无用的数据
      ReceiveData = Mid(ReceiveData, Len(ReceiveData) - 7)
    End If
     If i > 0 Then
      j = InStr(ReceiveData, Chr(13) + Chr(10) + "OK")'处理接收的数据
    endif
   end select
ErrHandle1:
  msgbox Err.Number
 End Sub
     comm是通用接口,双方用不同的通信协议,具体的数据格式不一致,需根据数据报文具体处理,我写很早前自己做的利用手机串口收发短信的事件。


[此贴子已经被作者于2016-3-11 12:37编辑过]

#9
wds12016-03-11 16:30
你用的PCOMM,可以按如下方法设置
ret=sio_ioctl (DataCOM, B12800, P_NONE | BIT_8 | STOP_1 );
if(ret!=SIO_OK)
ShowMessage("数据串口\n打开失败!")


sio_ioctl不同版本,串口初始化函数可能不一样

#10
dull20122016-03-15 11:35
还是没有解决,只能通过VC 重新编辑了
1