yuanshi3 发表于 2009-6-16 16:57:53

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

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

                                             下面是通信协议

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

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


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

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

5.开与关PORTA口的部分IO口的命令
AA AA AAFF05   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;
                                }

tuy0326 发表于 2009-6-16 17:20:00

不知道你串口通讯用的是哪个控件,估计跟你串口控件有关系,你直接结束掉是不行的,因为你串口没有关闭,资源并没有释放掉,所以当你再次打开的时候,串口就被占用了,串口是独占的,没人再能抢得回来了

yuanshi3 发表于 2009-6-16 17:34:17

回复tuy0326 :用的是mscomm控件

snoopyzz 发表于 2009-6-16 17:41:15

打开串口前先关闭一次...

yuanshi3 发表于 2009-6-16 22:57:09

回3楼 我就是这样做的 打开前关闭 再开启

yuanshi3 发表于 2009-6-17 21:05:28

有哪位以前也碰见过类似的问题

tuy0326 发表于 2009-6-17 21:15:14

VB,真的不知道

yuanshi3 发表于 2009-6-18 14:12:08

小马哥说用api做不知道怎么做

yuanshi3 发表于 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

yuanshi3 发表于 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 可以解决

zbhrose 发表于 2009-6-28 17:07:52

我估计你是用了USB转COM吧,如果我说对了是因为软串口掉线

shanghai2009 发表于 2009-6-28 21:37:59

你的程序写的不好!第1可以用定时器来定时查看串口里来的数据,第2可以用mscomm控件的OnComm事件

yuanshi3 发表于 2009-6-28 22:25:45

【10楼】 zbhrose 很准啊 就是用的USB转COM,电脑上的com不好使 我就把电路板上的com转usb插到电脑上的,你说的软串口掉线 怎么来解决?谢谢了,也谢谢shanghai2009 ,也在找程序问题,但是我全是往下发送,下位机不往上发送,所以看不到串口来的数据。oncomm我现在就是用的这个。
页: [1]
查看完整版本: 请教为什么串口通信不顺畅,不知道是什么原因?