救命呀!!关于串口数据处理的问题 点击:1572 | 回复:8



曾杏雪

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 3回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2005年7月01日
发表于:2005-07-01 09:46:00
楼主
通讯协议是:rs232,9针、主动发送、通信方式:全双工,异步传输格式、形式:EIA-RS-232C波特率:600bps-19200bps、8位数据位,1位停止位,无奇偶校验位、编码:ASCII 码 数据格式,22位 | | |,| | |,| | |,|数据位8位| | C| M|CR|LF| 根据这个我用vb做了通讯程序,但是数据读出后的不太会处理,还望高手指教!程序: Option Explicit Private strRecbuf As String ' Double Private Sub Command1_Click() On Error Resume Next With MSComm1 .CommPort = 1 '你可以选择你的端口号 .Settings = "9600,n,8,1" '这个可以根据你的要求来改成4800,19200等 .InputLen = 0 .RThreshold = 1 .InputMode = comInputModeText .InBufferSize = 40 .InputLen = 1 End With If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If 'Text1.Text = strRecbuf Command4.Visible = True Command1.Visible = False End Sub Private Sub Command4_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False MSComm1.RThreshold = 0 MSComm1.InBufferCount = 0 Close #1 End If Command1.Visible = True Command4.Visible = False End Sub Private Sub MSComm1_OnComm() On Error Resume Next Select Case MSComm1.CommEvent Case comEvReceive MSComm1.InputLen = 1 strRecbuf = strRecbuf + MSComm1.Input If strRecbuf <> strRecbuf Then MSComm1.RThreshold = 0 txtRec.SelText = "" End If '加上这个 txtRec.Text = Mid(strRecbuf, 7, 9) Case comEvSend End Select 'If InStr(strRecbuf, Chr(9)) Then '就是你的LF字符,也许不是chr(10),你自己定就可以了 'strRecbuf = "" 'txtRec.SelText = Chr(9) 'Exit Sub 'End If If InStr(strRecbuf, Chr(21)) Then txtRec.Text = CDbl(Mid(strRecbuf, 7, 9)) '这里处理你的数据,你自己看看,那个Mid里面的参数试着改变一下。 strRecbuf = "" Exit Sub End If End Sub ++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++ 主要问题:1、数据位总是取不对,读出的数值,每次运行都不同,周期变化5-7次一遍,我用log记录的格式为: 8.23 cm ust gst 8.23 cm ust gst 8.23 cm 8.23 cm ust gst 8.23 cm ust gst 8.23 cm 。。。。。。 主要问题: 2、只能读取当时点击时得到的数值,发连续工作,就是只能度一次!!! 还望高手多指点!!!!!!



曾杏雪

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 3回
  • 年度积分:0
  • 历史总积分:13
  • 注册:2005年7月01日
发表于:2005-07-01 10:14:00
1楼
帮帮忙呀!!!第一份工作!!要不就失业了,女的作这些很难呀!!

不系之舟

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:1450
  • 注册:2005年7月02日
发表于:2005-07-04 16:54:00
2楼
dd

舞天涯

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 24回
  • 年度积分:0
  • 历史总积分:58
  • 注册:2002年6月05日
发表于:2005-08-12 15:35:00
3楼
我也碰到过,接收时间不够。用接收事件触发时,常有接收不全的问题。事件触发时,不要马上读,等一段时间再读

南国微雨

  • 精华:0帖
  • 求助:0帖
  • 帖子:18帖 | 69回
  • 年度积分:0
  • 历史总积分:161
  • 注册:2005年7月14日
发表于:2005-08-15 15:48:00
4楼
数据传输有一定延时,请在编程时注意。

网络人生

  • 精华:0帖
  • 求助:0帖
  • 帖子:26帖 | 125回
  • 年度积分:0
  • 历史总积分:222
  • 注册:2003年7月08日
发表于:2005-08-17 16:01:00
5楼
1、首先检查网络传输的稳定性 2、可以用校验保证传输的正确性,是软校验。 3、设置超时退出,保证循环处理的可行性。 http://icmcn.home.sunbo.net,可以访问一下,看有没有帮助。

Strength

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 11回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2003年12月02日
发表于:2005-09-08 10:25:00
6楼
呵呵,曾杏雪 你就是 zengxingxue 啊,我还以为是一男生呢,呵呵,偶是Winters_lee啦,告诉你通讯的那个(上面的代码我有写哦,怪不得这么眼熟),想不到在这里碰到你。

hz568

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 33回
  • 年度积分:0
  • 历史总积分:89
  • 注册:2004年3月21日
发表于:2005-09-10 12:17:00
7楼
看了下你写的程序,VB中用MSCOMM控件对串口接收数据,不能你那么写. 感觉你是用单片机的方法操作串口.上位机不一样的,在 MSComm1_OnComm事件中,你只要将读出缓冲区的数据就可以了,下位机每往上位机发数据时,就触发一次ONCOMM事件,你不能一个个字节来读,直接读出就是一帧数据了,至于是二进制的还是ASCII码,那就得看你通讯协议了.

邪恶至尊

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 117回
  • 年度积分:0
  • 历史总积分:281
  • 注册:2004年10月21日
发表于:2005-09-10 12:32:00
8楼
不要用触发,用延时比较好

热门招聘
相关主题

官方公众号

智造工程师