×

Loading...
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务
Ad by
  • 推荐 OXIO 加拿大高速网络,最低月费仅$40. 使用推荐码 RCR37MB 可获得一个月的免费服务

[求助]从SERIAL PORT读取数据.

我参照例子, 用CREATEFILE取的COM1的HANDLE, 然后设置其配置, 最后, 用READFILE来获取COM1的数据, 但是, 每次一到READFILE, 就会报 INVALID HANDLE的错误.

大致代码:
//取得COM1的HANDLE
HANDLE m_Port = CreateFile("COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (m_Port == INVALID_HANDLE_VALUE){
// Handle the error.
return false ;
}

// 配置COM1
DCB dcb;

if (!GetCommState(m_Port, &dcb)){
return false;
}

dcb.BaudRate = CBR_9600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

if (!SetCommState(m_Port, &dcb)){
return false;
}

//读取数据
char input[200];
unsigned int lenBuff = 200;
LPDWORD lenMessage;

String *strResult;

if(ReadFile(m_Port,input,lenBuff,lenMessage,NULL)==0){ //这里会有EXCEPTION
return false;
}
Report

Replies, comments and Discussions:

  • 工作学习 / IT技术讨论 / [求助]从SERIAL PORT读取数据.
    我参照例子, 用CREATEFILE取的COM1的HANDLE, 然后设置其配置, 最后, 用READFILE来获取COM1的数据, 但是, 每次一到READFILE, 就会报 INVALID HANDLE的错误.

    大致代码:
    //取得COM1的HANDLE
    HANDLE m_Port = CreateFile("COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    if (m_Port == INVALID_HANDLE_VALUE){
    // Handle the error.
    return false ;
    }

    // 配置COM1
    DCB dcb;

    if (!GetCommState(m_Port, &dcb)){
    return false;
    }

    dcb.BaudRate = CBR_9600; // set the baud rate
    dcb.ByteSize = 8; // data size, xmit, and rcv
    dcb.Parity = NOPARITY; // no parity bit
    dcb.StopBits = ONESTOPBIT; // one stop bit

    if (!SetCommState(m_Port, &dcb)){
    return false;
    }

    //读取数据
    char input[200];
    unsigned int lenBuff = 200;
    LPDWORD lenMessage;

    String *strResult;

    if(ReadFile(m_Port,input,lenBuff,lenMessage,NULL)==0){ //这里会有EXCEPTION
    return false;
    }
    • It seems ok. Why not post all code?
      • 全部代码就是这样了. 我试过CBUILDER, 试过.NET, 都一样, 说那个HANDLE无效.
    • try "COM1" or "\\\\.\\COM1"
      • same. 我的机器有COM1 AND COM2, 我用COM1:, COM1, COME2, COM2, \\\\.\\COM1, 都可以在CREATEFILE取得HANDLE,
        而一旦我用COM3, 就会在开始FAIL, INVALID HANDLE, 我就是不明白, 怎么开始都行, 到了READFILE就出错了, CBUILDER说是ACCESS VIOLATION, .NET说是什么OBJECT REFERENCE 没有定义, 总之就是HANDLE无效.
        • try seek to the begin of the file
          • 什么意思? 能详细点么?本人编程初级水平...
            • I mean ,using fseek function move file pointer to the begin of the file
        • 记得以前Windows缺省并没有COM3,你需要到Control Panel加一个虚的。
          • 我不知道怎么加一个虚拟的, 但是我可以这样一来, DISABLE COM2, 再运行程序, COM2在CREATEFILE就是INVALID HANDLE了.
            就是说, 从CREATEFILE, 到SETCOMM, HANDLE都是可以的, 一到READFILE就歇菜了.
        • There is no COM3 at all.
    • debug the code to find out when the handle becomes invalid....
      • 就在READFILE那一行里面, 我COMMENTS了所有关于CONFIGURATION的代码.
        HWND m_Port;
        try{
        //open handle
        m_Port = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

        if (m_Port == INVALID_HANDLE_VALUE){
        // Handle the error.
        Memo->Lines->Add("Invalid Handle");
        return;
        }

        char input[200];
        unsigned int lenBuff = 200;
        LPDWORD lenMessage;

        if(ReadFile(m_Port,input,lenBuff,lenMessage,NULL)==0){
        Memo->Lines->Add("Failed in Reading Data");
        }else{
        Memo->Lines->Add(input);
        }
    • Change lenMessage from LPDWORD to DWORD, use &lenMessage in ReadFile (). It will be ok.