注册 登录
编程论坛 VB6论坛

请高手看下,API串口通讯问题?只接收到第一个字符。

bygoodssn 发布于 2016-07-19 10:24, 2277 次点击
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
》》》》》》》》》》》》》》》


Public Function ReadData(fhdata As String, Optional lngSize As Long = 255, Optional Outtime As Long = 2000, Optional txtRecv As TextBox) As Long
    On Error GoTo Routine_Exit                                   '打开错误陷阱


    If (com_Handle = 0) Then
        ReadData = 0
        Exit Function
    End If


    Dim lngBytesRead As Long
    Dim fReadStat As Long
    Dim lngErrorFlags As Long
    Dim lngStatus As Long
    Dim udtCommStat As COMSTAT

    '读数据
     If ClearCommError(com_Handle, lngErrorFlags, udtCommStat) <= 0 Then
        PurgeComm com_Handle, PURGE_RXABORT Or PURGE_RXCLEAR
    End If
        fhdata = Space$(255)
        
        fReadStat = ReadFile(com_Handle, ByVal fhdata, lngSize, fReadStat, m_OverlappedRead)
        txtRecv.Text = txtRecv.Text & Trim$(fhdata)
        ClearInBuf                                         '清除缓冲区
   
    ReadData = lngBytesRead
   
    Exit Function
Routine_Exit:
    ReadData = 0
End Function
5 回复
#2
xiangyue05102016-07-19 13:00
这个没有玩过,只能帮顶了
#3
bygoodssn2016-07-19 17:23
谢谢,这是字节数组与字符数组转换存在问题。
#4
xiangyue05102016-07-20 11:22
以下是引用bygoodssn在2016-7-19 17:23:29的发言:

谢谢,这是字节数组与字符数组转换存在问题。

如果解决了,愿意的话给一个相对详细的原因和解决方法。 予人玫瑰,手有余香。 我们鼓励分享经验。
#5
风吹过b2016-07-20 11:32
没用过。感觉这里有问题。
        fhdata = Space$(255)
        fReadStat = ReadFile(com_Handle, ByVal fhdata, lngSize, fReadStat, m_OverlappedRead)

这里是不是定义一个BYTE数组更好一点。

原因是:VB是 Unicode 的,调用 API 时,临时转换为 ANSI 的,调用完成后,再从 ANSI 转回 Unicode。
在转回的过程中,遵守 chr(0) 中止的规则。
你接收的数据中,如果有 chr(0) ,就会导致在这里被截断。


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

#6
bygoodssn2016-07-21 15:30
五楼正解。。。
1