搜索
bottom↓
回复: 12

请教为什么串口通信不顺畅,不知道是什么原因?

[复制链接]

出0入0汤圆

发表于 2009-6-16 16:57:53 | 显示全部楼层 |阅读模式
请教下大家个问题 :我VB编写exe界面,用于与下位机mega16进行通信,界面有时候就不好使,现象是这样的:有时候点击一个控件,点击另外个控件就不行,点不了,或者要点击两次, 这样就需要关闭程序重新打开或者干脆就打开说串口占用了,这样唯一的办法就得重启电脑(在任务管理器里删除我VB生成的exe都删除不了)。一点规律都没有。请大伙分析下是什么原因?在此非常感谢!
                                                

                                               下面是通信协议

格式:
标志(3字节) 数据长度(1字节) 命令(1字节) 参数(若干字节)
协议内容

1.平台上升
  AA AA AA   FF   01  XX   XX;第一组两字节代表脉冲频率数
   
2.平台下降
  AA AA AA    FF 02  ;不发送脉冲数


3.开始搅拌(开直流电机)
  AA AA AA   FF  03 XX XX      XX     XX;第一组两字节是运行秒数 ,第二组字节代表方向: 01正向 02反向 03正反转,第三组对应的拖拉条的值,即调加减速的值,与下位机相对应的是j值。

4.停止搅拌(关直流电机)
  AA AA AA  FF 04

5.开与关PORTA口的部分IO口的命令
  AA AA AA  FF  05   XX ;这个字节XX如果是92对应开始注入液体“开”(PORTA=0x92),9A对应开始停止注入“关”(PORTA=0x9A),24对应开始冲散液体“开”(PORTA=0x24),1C对应开始停止冲散“关”(PORTA=0x1C),16对应开始抽取液体“开”(PORTA=0x16),1E对应开始停止抽取“关”(PORTA=0x1E)。


                                                  下面是下位机针对平台上升的部分
case 0x01:
                                {
                                        unsigned char StepNum1= getcharWithTime(0xfffffff ,&Err);
                                        if(Err==0)
                                        {
                                                state=0;
                                                break;
                                        }
                                        unsigned char StepNum2= getcharWithTime(0xfffffff ,&Err);
                                        if(Err==0)
                                        {
                                                state=0;
                                                               break;
                                        }
                                                       if(StepMove( StepNum1*255+StepNum2, 0))
                                                putstr("\xaa\xaa\xaa\xff\x01");
                                        else
                                                putstr("\xaa\xaa\xaa\xff\x00");
                                        state=0;
                                        break;
                                }

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-6-16 17:20:00 | 显示全部楼层
不知道你串口通讯用的是哪个控件,估计跟你串口控件有关系,你直接结束掉是不行的,因为你串口没有关闭,资源并没有释放掉,所以当你再次打开的时候,串口就被占用了,串口是独占的,没人再能抢得回来了

出0入0汤圆

 楼主| 发表于 2009-6-16 17:34:17 | 显示全部楼层
回复tuy0326 :用的是mscomm控件

出0入0汤圆

发表于 2009-6-16 17:41:15 | 显示全部楼层
打开串口前先关闭一次...

出0入0汤圆

 楼主| 发表于 2009-6-16 22:57:09 | 显示全部楼层
回3楼 我就是这样做的 打开前关闭 再开启

出0入0汤圆

 楼主| 发表于 2009-6-17 21:05:28 | 显示全部楼层
有哪位以前也碰见过类似的问题

出0入0汤圆

发表于 2009-6-17 21:15:14 | 显示全部楼层
VB,真的不知道

出0入0汤圆

 楼主| 发表于 2009-6-18 14:12:08 | 显示全部楼层
小马哥说用api做  不知道怎么做

出0入0汤圆

 楼主| 发表于 2009-6-23 22:38:04 | 显示全部楼层
我已经用串口调试器调试好了得 随便发送数据 就是与下位机容易跑飞 今天请教一个老师说 可能是我下面的数组的问题 就是发送数据的数组出问题了,大家看看:
Private Sub Command20_Click()
    Dim Temp As String
    'Dim Temp1 As String
    'Dim Temp2 As String
    'Dim longth As Byte
    Dim buff_out() As Byte
    ReDim buff_out(6)
    buff_out(0) = &HAA
    buff_out(1) = &HAA
    buff_out(2) = &HAA
    buff_out(3) = &HFF
    buff_out(4) = &H1
    Open App.Path & "\2.txt" For Input As #2
    Line Input #2, Temp
    Close #2
    buff_out(6) = Temp Mod 256
    buff_out(5) = (Temp - buff_out(6)) / 256
  If MSComm1.PortOpen = False Then
      Label1.Caption = "您的串口现在是关闭状态,请先打开串口"
        Else
      'Temp = Text2.Text
      'longth = strHexToByteArray(Temp, bytSendByte())
          'If longth > 0 Then
          MSComm1.Output = buff_out
          'MSComm1.Output = bytSendByte
          'End If
        Label1.Caption = ""
      'MSComm1.Output
  End If
End Sub

出0入0汤圆

 楼主| 发表于 2009-6-28 16:59:12 | 显示全部楼层
Private Sub Command20_Click()
    Dim Temp As String
    Dim buff_out7() As Byte
    ReDim buff_out7(8)
    Dim u As Long
    MSComm1.Settings = "9600,N,8,1"   ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
    MSComm1.InputLen = 0              ' 当输入占用时,告诉控件读入整个缓冲区。
    buff_out7(0) = &HAA
    buff_out7(1) = &HAA
    buff_out7(2) = &HFF
    buff_out7(3) = &H1
    Open App.Path & "\2.txt" For Input As #2
        Line Input #2, Temp
    Close #2
    u = Val(Temp)
    If u > 0 And u < 65536 Then
    buff_out7(5) = u Mod 256
    buff_out7(4) = u \ 256
    buff_out7(6) = &H0
    buff_out7(7) = &H0
    buff_out7(8) = &HFF
        If MSComm1.PortOpen = False Then
          Label1.Caption = "您的串口现在是关闭状态,请先打开串口"
        Else
            MSComm1.Output = buff_out7
            Label1.Caption = ""
        End If
    End If
End Sub



针对这个用doevents 怎么解决啊 ?有的说用doevents 可以解决

出0入0汤圆

发表于 2009-6-28 17:07:52 | 显示全部楼层
我估计你是用了USB转COM吧,如果我说对了是因为软串口掉线

出0入0汤圆

发表于 2009-6-28 21:37:59 | 显示全部楼层
你的程序写的不好!第1可以用定时器来定时查看串口里来的数据,第2可以用mscomm控件的OnComm事件

出0入0汤圆

 楼主| 发表于 2009-6-28 22:25:45 | 显示全部楼层
【10楼】 zbhrose 很准啊 就是用的USB转COM,电脑上的com不好使 我就把电路板上的com转usb插到电脑上的,你说的软串口掉线 怎么来解决?谢谢了,也谢谢shanghai2009 ,也在找程序问题,但是我全是往下发送,下位机不往上发送,所以看不到串口来的数据。oncomm我现在就是用的这个。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表