下边是我接收数据并保存的代码,我接收数据比较快,下位机会每隔20ms给我一段数据,我的在20ms内将收到的数据保存下来,现在我使用下边的代码VB程序提示我“语法错误(操作符丢失)在查询表达式”100255f90801271c“
100255f90801271c是我当时接收到下位发送的数据。麻烦论坛的朋友帮我看看我下边的代码是什么问题,是时间段处理不过来吗?
Private Sub MSComm1_OnComm()
Dim inByte() As Byte, byt As Byte, bytsj() As Byte
Dim i As Integer
Dim t As String, str1 As String
Dim sqlinsert As String
strData = ""
Select Case MSComm1.CommEvent
        Case comEvReceive
            MSComm1.RThreshold = 0              '禁止在处理数据时再触发OnComm事件,而干扰了数据处理
            inByte = MSComm1.Input
        For i = 0 To UBound(inByte)
        If Len(Hex(inByte(i))) = 1 Then
            str1 = 0 & Hex(inByte(i))
        Else
            str1 = Hex(inByte(i))
        End If
            strData = strData & str1
        Next
            MSComm1.InBufferCount = 0       '清空缓冲区数据,避免下次通信出错。
            MSComm1.RThreshold = 1          '恢复每次读一个触发一次OnComm事件
            Text6 = strData
        
sqlinsert = "insert into 客车列尾运行数据 values (" + Text6.Text + ")"
Dim rs_suminsert As New ADODB.Recordset
rs_suminsert.CursorLocation = adUseClient
rs_suminsert.Open sqlinsert, conn, adOpenKeyset, adLockPessimistic
End SelectEnd Sub

解决方案 »

  1.   

    sqlinsert = "insert into 客车列尾运行数据 values ('" & Text6.Text & "')"
      

  2.   

    表中如果有多个字段请以以下格式,对应插入:
    INSERT INTO titles
             (title_id, title, type, pub_id, price)
    VALUES   ('BU9876', 'Creating Web Pages', 'business', '1389', '29.99')
      

  3.   

    猴哥,你看语法是这样吗
    INSERT INTO 表的名称(客车列尾运行数据)(字段名(主机编号),字段名(命令名称)。)values (填入的内容(text6.text),填入的内容(text2.text)。) 
    我这样试过以后还是提示刚才的错误。
      

  4.   

    sql="INSERT INTO [客车列尾运行数据] ([主机编号]) values ('" & text6.text & "')"
      

  5.   

    ACCESS 字符串要用单引号引起来,日期要用#号引起来。
    sql server 字符串与日期都要用单引号引起来。这与字段类型有关。
    看一下你的表的字段类型……
      

  6.   

    猴哥sql="INSERT INTO [客车列尾运行数据] ([主机编号]) values ('" & text6.text & "')"这样可了,我在把其他的字段加上看看。
    谢谢你。
      

  7.   

    Option ExplicitPrivate Sub MSComm1_OnComm()
        Dim inByte() As Byte
        Dim byt As Byte
        Dim bytsj() As Byte
        Dim i As Integer
        Dim t As String
        Dim str1 As String
        Dim sqlinsert As String
        Dim rs_suminsert As New ADODB.Recordset
        strData = ""
        Select Case MSComm1.CommEvent
            Case comEvReceive
                MSComm1.RThreshold = 0              '禁止在处理数据时再触发OnComm事件,而干扰了数据处理
                inByte = MSComm1.Input
                For i = 0 To UBound(inByte)
                    If Len(Hex(inByte(i))) = 1 Then
                        str1 = 0 & Hex(inByte(i))
                    Else
                        str1 = Hex(inByte(i))
                    End If
                    strData = strData & str1
                Next
    '            MSComm1.InBufferCount = 0      '去掉的原因是你在处理数据时串口可能又接收到了数据
                Text6.Text = strData
                '你的数据库语句错了,不符合SQL规范
    '            sqlinsert = "insert into 客车列尾运行数据 values (" & Text6.Text & ")"
    '            rs_suminsert.CursorLocation = adUseClient
    '            rs_suminsert.Open sqlinsert, conn, adOpenKeyset, adLockPessimistic
                
                MSComm1.RThreshold = 1          '恢复每次读一个触发一次OnComm事件
        End SelectEnd Sub
      

  8.   

    我现在用下边的代码接收数据,但是发现我没有完整的接收完一条数据就进行保存了,请问下怎么设置下我接收数据的长度,就是等下位机把一条数据完整的发送上来后我在进行操作和保存。
    Private Sub MSComm1_OnComm()
    Dim inByte() As Byte, byt As Byte, bytsj() As Byte
    Select Case MSComm1.CommEvent
            Case comEvReceive
                MSComm1.RThreshold = 0              '禁止在处理数据时再触发OnComm事件,而干扰了数据处理
                inByte = MSComm1.Input
            For i = 0 To UBound(inByte)
            If Len(Hex(inByte(i))) = 1 Then
                str1 = 0 & Hex(inByte(i))
            Else
                str1 = Hex(inByte(i))
            End If
                strData = strData & str1
            Next
                'MSComm1.InBufferCount = 0       '清空缓冲区数据,避免下次通信出错。
                Text6 = strData
                MSComm1.RThreshold = 1          '恢复每次读一个触发一次OnComm事件
    sqlinsert = "insert into [客车列尾运行数据] ([主机编号]) values ('" + Text6.Text + "')"
    Dim rs_suminsert As New ADODB.Recordset
    rs_suminsert.CursorLocation = adUseClient
    rs_suminsert.Open sqlinsert, conn, adOpenKeyset, adLockPessimistic
    MSComm控件的设置为
    With MSComm1
            .CommPort = 1
            .Settings = "9600,n,8,1"
            .InBufferCount = 0
            .InputLen = 0
            .RThreshold = 1
            .InputMode = comInputModeBinary '以2进制接收
            .PortOpen = True
      

  9.   

    建议你在触发OnComm事件是让程序等待一小会儿,这样会让串口完全接收到数据。即在MSComm1.RThreshold = 0语句后边插入一句:Sleep 10Sleep是API函数,它的作用是让程序等待10毫秒,以便数据充分接收,等待的时间要足够
    还有一点,20ms一次通信是不是太频繁了些??个人认为没有必要,再次,为了节省时间,把你的波特率加倍吧,改为:19200试一试。
      

  10.   

    楼上的朋友sleep的方法我已经试过了,我已近sleep10了,结果收到的数据还是一条被分成2条来记录了,如果再加大等待时间,估计就要丢数据了。还有就是每20ms发送一次数据是协议订好的吗,没法改的。还有波特率这些都不能改。