串口连接 - ReadFile总是返回4个字节读取

时间:2016-09-08 19:20:25

标签: c++ c serial-port uart

我正在尝试通过ReadFile读取,但总是得到它读取的4个字节,不会嘀咕字符串有多长。

UART* uart = (UART*)lpParam;
char TempChar; //Temporary character used for reading
char SerialBuffer[256];//Buffer for storing Rxed Data
DWORD NoBytesRead;
int i = 0;

do
{
    NoBytesRead = 0;
    ReadFile(uart->connHandle,           //Handle of the Serial port
        &SerialBuffer,       //Temporary character
        sizeof(256),//Size of TempChar
        &NoBytesRead,    //Number of bytes read
        NULL);

    //SerialBuffer[i] = TempChar;// Store Tempchar into buffer
    i++;
    if (NoBytesRead > 0)
    {
        char* strMsg = (char*)malloc(sizeof(256 * sizeof(char)));
        SerialBuffer[NoBytesRead] = '\0';
        TRACE("read %d- %s\n", NoBytesRead,SerialBuffer);
        strcpy_s(strMsg, 256,SerialBuffer);
        ControllerPublishMsg(uart->controller, SerialBuffer);
    }
    SerialBuffer[0] = '\0';

如果我发送字符串“hh”到连接我得到输出“read 4 hh”。 该字符串长度为2个字节,但NoBytesRead = 4。

感谢。

3 个答案:

答案 0 :(得分:2)

sizeof(256)默认为sizeof(int),这是四个字节。将sizeof(256)替换为256。同时将sizeof(256 * sizeof(char))替换为(256 * sizeof(char))

答案 1 :(得分:1)

想一想声明

sizeof(256)

您作为缓冲区大小传递。

该表达式的评估与

相同
sizeof(int)

可能在您的平台上评估为4。您需要将字面值256或更高sizeof SerialBuffer移交给ReadFile

你的malloc论证中出现了同样的错误。

如果没有发送方的代码,当您(想想)只发送2个字符时,为什么接收4个字符是不可能的。如果ReadFile返回4,则最有可能收到4个字符。由于混乱的缓冲区大小参数,它将无法接收超过4个字符

答案 2 :(得分:1)

您滥用sizeof

调用ReadFile()时,您使用sizeof(256)作为要读取的字节数。默认情况下,数字文字是int,因此您实际上使用的是sizeof(int),这是编译器上的4个字节。摆脱sizeof并单独使用256

ReadFile(uart->connHandle,           //Handle of the Serial port
    &SerialBuffer,       //Temporary character
    256,//Size of TempChar
    &NoBytesRead,    //Number of bytes read
    NULL);

或者更好的是,摆脱256并使用sizeof(SerialBuffer)代替,因为它是一个在编译时已知固定大小的静态数组:

ReadFile(uart->connHandle,           //Handle of the Serial port
    &SerialBuffer,       //Temporary character
    sizeof(SerialBuffer),//Size of TempChar
    &NoBytesRead,    //Number of bytes read
    NULL);

调用malloc()时,你犯了类似的错误。 sizeof(char)始终为1,因此您实际上再次呼叫sizeof(256)。再说一遍,你可以摆脱sizeof,只使用256

char* strMsg = (char*) malloc(256 * sizeof(char));
// or just: char* strMsg = (char*) malloc(256);

虽然,你实际上并没有将strMsg用于任何(并且你正在泄露它),所以你应该完全摆脱它。

尝试更像这样的事情:

UART* uart = (UART*)lpParam;
char SerialBuffer[257];//Buffer for storing Rxed Data
DWORD NoBytesRead;

do
{
    NoBytesRead = 0;
    ReadFile(uart->connHandle, //Handle of the Serial port
        SerialBuffer, //Temporary buffer
        sizeof(SerialBuffer)-1,//Size of buffer minus null-terminator
        &NoBytesRead, //Number of bytes read
        NULL);

    if (NoBytesRead > 0)
    {
        SerialBuffer[NoBytesRead] = '\0';
        TRACE("read %u- %s\n", NoBytesRead, SerialBuffer);
        ControllerPublishMsg(uart->controller, SerialBuffer);
    }