簡體   English   中英

用C ++讀取串口

[英]serial port Reading in c++

我試圖用C ++編寫代碼以從串行端口讀寫,我寫了以下代碼,現在我試圖通過在USB到串行電纜上進行回送來測試這一點,當我寫除零以外的任何東西時,我都成功讀取了,但是當寫入零時,程序停止讀取並且不讀取零后的任何東西,並且在顯示讀取緩沖區時給我零(在該程序中,它顯示讀取緩沖區的零,但是如果我寫任何東西,例如使寫循環寫“ words = 127-我”,閱讀器緩沖區將顯示我所寫的全部內容,直到達到零為止)請迅速提供幫助

#include    <windows.h>
#include    <stdlib.h>
#include    <stdio.h>
#include    <string.h>
#include    <commdlg.h>
#include    <iostream>
//#include  <windef.h>
using namespace std;
int nread,nwrite;

void main()
{
    HANDLE hSerial;
    COMMTIMEOUTS timeouts;
    COMMCONFIG dcbSerialParams;
    char words[128], *buffWrite;
    DWORD dwBytesWritten, dwBytesRead;

    hSerial = CreateFile(TEXT("COM1"),GENERIC_READ  |GNERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);      

    if(hSerial == INVALID_HANDLE_VALUE) 
    {
        if (GetLastError() == ERROR_FILE_NOT_FOUND)
        {
            printf(" serial port does not exist \n");
        }
        printf(" some other error occured. Inform user.\n");
    }

    // DCB    dcbSerialParams ;
    //GetCommState( hSerial, &dcbSerialParams.dcb);
    if (!GetCommState(hSerial, &dcbSerialParams.dcb)) 
    {
        printf("error getting state \n");
    }

    dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);
    dcbSerialParams.dcb.BaudRate = CBR_2400;
    dcbSerialParams.dcb.ByteSize = 8;
    dcbSerialParams.dcb.StopBits = ONESTOPBIT;
    dcbSerialParams.dcb.Parity = NOPARITY;

    dcbSerialParams.dcb.fBinary = TRUE;
    dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_ENABLE;
    dcbSerialParams.dcb.fOutxCtsFlow = TRUE;
    dcbSerialParams.dcb.fOutxDsrFlow = TRUE;
    dcbSerialParams.dcb.fDsrSensitivity= FALSE;
    dcbSerialParams.dcb.fAbortOnError = TRUE;

    if(!SetCommState(hSerial, &dcbSerialParams.dcb)) 
    {
        printf(" error setting serial port state \n");
    }
    SetCommMask( hSerial,EV_RXCHAR);

    GetCommTimeouts(hSerial,&timeouts);
    //COMMTIMEOUTS timeouts = {0};

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier= 10;

    if(!SetCommTimeouts(hSerial, &timeouts)) 
    {
        printf("error setting port state \n");
    }

    // printf("This is a string to be written to serial port COM1 \n\n\n");

    //****************Write Operation*********************//
    //words = "This is a string to be written to serial port COM1";
    //dwBytesWritten=1;
    cout<<"Data written to write buffer is \n";
    for(int i=0;i<128;i++)
    {
        words[i]=i;
        cout<<(int)words[i]<<",";
    }
    cout<<endl;
    nwrite = strlen(words);

    buffWrite = words;
    dwBytesWritten = 0;

    if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL)) 
    { 
        printf("error writing to output buffer \n");
    }


    //***************Read Operation******************//
    char buffsRead[128]="0",*buffRead;  
    dwBytesRead = 0;
    nread = strlen(buffsRead);
    buffRead = buffsRead;
    //ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL);
    if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL)) 
    {
        printf("error reading from input buffer \n");
    }
    // printf("Data read from read buffer is \n %s \n",(int)buffsRead);
    cout<<"Data read from read buffer is \n ";
    for(int j=0;j<128;j++)
    {
        cout<<(int)buffsRead[j]<<",";
    }
    cout<<endl;

    CloseHandle(hSerial);
    // system("PAUSE");
}  

問題在於您要計算的字節數。 你有

nwrite = strlen(words);

並且這不適用於二進制數據,因為strlen在第一個'\\0' (NUL字符)處停止。

只需在循環中調整nwrite ,使其最終增加所添加的字符數。 更換

words[i]=i;

words[nwrite++] = i;

並擺脫nwrite = strlen(words); 一切都會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM