C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 使用WriteFile / ReadFile的Serial Comm大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
//#include "StdAfx.h"
#include <stdio.h> 
#include <windows.h> 
#include <winbase.h>
#include <iostream>
#include <tchar.h>
using namespace std;

int main()
{

    int com = 'COM2';
    String data = "\n 010400 \n";
    char output[32];
    //unsigned int length = 0;
    DCB config = {0};
    bool abConTinue = true;
    DWORD dwBytesWritten;
    DWORD  dwBytesRead;
    int isRead = false;

    HANDLE m_hCommPort = ::CreateFile(L"COM2",GENERIC_READ|GENERIC_WRITE,//access ( read and writE)

        0,//(sharE) 0:cAnnot share the COM port                        

        0,//security  (NonE)                

        OPEN_EXISTinG,// creation : open_exisTing

        0,// we dont want overlapped operation

        0// no templates file for COM port...

        );

    config.DCBlength = sizeof(config);


    if((GetCommState(m_hCommPort,&config) == 0))
    {
        printf("Get configuration port has a problem.");
        return falSE;
    }

    config.baudRate = 9600;
    config.StopBits = OnesTOPBIT;
    config.Parity = PARITY_NONE; 
    config.byteSize = DATABITS_8;
    config.fDtrControl = 0;
    config.fRtsControl = 0;

    if (!SetCommState(m_hCommPort,&config))
    {

        printf( "Failed to Set Comm State Reason: %d\n",GetLastError());
        //return E_FAIL;
    }

    printf("Current SetTings\n Baud Rate %d\n Parity %d\n Byte Size %d\n Stop Bits %d",config.baudRate,config.Parity,config.byteSize,config.StopBits);

    int isWritten = WriteFile(m_hCommPort,&data,(DWORD) sizeof(data),&dwBytesWritten,null);


    //memset(output,sizeof(output));
    while (abConTinuE) 
    {

        isRead = ReadFile(m_hCommPort,output,sizeof(output),&dwBytesRead,null);

        if(!isRead)
        {
            abConTinue = false;
            break;
        }

    }

    cin.get();
}

我在从com端口读取时遇到问题.如果我单步执行代码,它将进入“isRead = ReadFile(m_hCommPort,& dwBytesRead,null);”并且没有回来……这是我第一次尝试这个没有成功.

解决方法

在打开文件之后,在尝试使用它之前,您可能会尝试使用类似的代码
COMMTIMEOUTS timeouts;

timeouts.ReadIntervalTimeout = 1;
timeouts.Read@R_487_10586@lTimeoutMultiplier = 1;
timeouts.Read@R_487_10586@lTimeoutConstant = 1;
timeouts.Write@R_487_10586@lTimeoutMultiplier = 1;
timeouts.Write@R_487_10586@lTimeoutConstant = 1;
if (!SetCommTimeouts(m_hCommPort,&timeouts))
    // setTing timeouts Failed.

编辑:也许更容易从一些有效的代码开始,并使它做你想做的,而不是试图让你的代码工作.这是一个简单的终端程序.它极端极简,但确实有效(至少足以让我看到GPS的输出,例如).从任何人(最不重要的是我)称之为复杂的方面来说,这是一个漫长的道路,但至少应该给出一些如何开始的想法.

#include <stdio.h>
#include <conio.h>
#include <String.h>

#define StriCT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

void system_error(char *Name) {
// Retrieve,format,and print out a message from the last error.  The 
// `name' that's passed should be in the form of a present tense noun 
// (phrasE) such as "opening file".
//
    char *ptr = NULL;
    Formatmessage(
        FORMAT_messaGE_ALLOCATE_BUFFER |
        FORMAT_messaGE_FROM_SYstem,GetLastError(),(char *)&ptr,1024,null);

    fprintf(stderr,"\nError %s: %s\n",name,ptr);
    LocalFree(ptr);
}

int main(int argc,char **argv) {

    int ch;
    char buffer[1];
    HANDLE file;
    COMMTIMEOUTS timeouts;
    DWORD read,written;
    DCB port;
    HANDLE keyboard = GetStdHandle(STD_INPUT_HANDLE);
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD mode;
    char port_name[128] = "\\\\.\\COM3";
    char init[] = ""; // e.g.,"ATZ" to completely reset a modem.

    if ( argc > 2 )
        sprintf(port_name,"\\\\.\\COM%c",argv[1][0]);

    // open the comm port.
    file = CreateFile(port_name,GENERIC_READ | GENERIC_WRITE,NULL,OPEN_EXISTinG,null);

    if ( INVALID_HANDLE_VALUE == filE) {
        system_error("opening file");
        return 1;
    }

    // get the current DCB,and adjust a few bits to our liking.
    memset(&port,sizeof(port));
    port.DCBlength = sizeof(port);
    if ( !GetCommState(file,&port))
        system_error("getTing comm state");
    if (!BuildCommDCB("baud=19200 parity=n data=8 stop=1",&port))
        system_error("building comm DCB");
    if (!SetCommState(file,&port))
        system_error("adjusTing port setTings");

    // set short timeouts on the comm port.
    timeouts.ReadIntervalTimeout = 1;
    timeouts.Read@R_487_10586@lTimeoutMultiplier = 1;
    timeouts.Read@R_487_10586@lTimeoutConstant = 1;
    timeouts.Write@R_487_10586@lTimeoutMultiplier = 1;
    timeouts.Write@R_487_10586@lTimeoutConstant = 1;
    if (!SetCommTimeouts(file,&timeouts))
        system_error("setTing port time-outs.");

    // set keyboard to raw reading.
    if (!GetConsoleMode(keyboard,&modE))
        system_error("getTing keyboard mode");
    mode &= ~ ENABLE_PROCESSED_INPUT;
    if (!SetConsoleMode(keyboard,modE))
        system_error("setTing keyboard mode");

    if (!EscapeCommFunction(file,CLRDTR))
        system_error("clearing DTR");
    Sleep(200);
    if (!EscapeCommFunction(file,SETDTR))
        system_error("setTing DTR");

    if ( !WriteFile(file,init,sizeof(init),&written,NULL))
        system_error("wriTing data to port");

    if (written != sizeof(init))
        system_error("not all data written to port");

    // basic terminal loop:
    do {
        // check for data on port and display it on screen.
        ReadFile(file,buffer,sizeof(buffer),&read,null);
        if ( read )
            WriteFile(screen,read,null);

        // check for keypress,and write any out the port.
        if ( kbhit() ) {
            ch = getch();
            WriteFile(file,&ch,1,null);
        }
    // until user hits ctrl-BACkspace.
    } while ( ch != 127);

    // close up and go home.
    CloseHandle(keyboard);
    CloseHandle(filE);
    return 0;
}

大佬总结

以上是大佬教程为你收集整理的c – 使用WriteFile / ReadFile的Serial Comm全部内容,希望文章能够帮你解决c – 使用WriteFile / ReadFile的Serial Comm所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。