欢迎使用CSDN-markdown编辑器

来源:互联网 发布:unity3d建筑可视化 编辑:程序博客网 时间:2024/06/09 16:37

VS2013+ 串口通信方法备忘

来自Arduino社区官方文档

Arduino and C++ (for Windows)
As I found it pretty hard finding the good information, or an already working code to handle Serial communication on windows based system, I finally made a class that do what is needed for basic Serial Communication, thanks to help of several forumers. Please note that this code might not be completely perfect so I encourage you to make any update needed so that it might become even better.

So now for the code which is consisting of two files, a header and a source code file.

Click here for an easy example using Visual Studio 2008 Express.

Important note: when connecting to some Arduinos, it is necessary to use COM port “device names” as outlined at http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1286253977/18#18.

Furthermore: When addressing ports larger than COM9 in Windows you will have to specify the port thusly: “COM10” becomes “\\.\COM10” See: http://support.microsoft.com/default.aspx?scid=kb;EN-US;q115831

And: CreateFile may need to be replaced with CreateFileA in Serial.cpp

SerialClass.h (header)

//头文件,直接导入工程头文件目录

#ifndef SERIALCLASS_H_INCLUDED#define SERIALCLASS_H_INCLUDED#define ARDUINO_WAIT_TIME 2000#include <windows.h>#include <stdio.h>#include <stdlib.h>class Serial{    private:        //Serial comm handler        HANDLE hSerial;        //Connection status        bool connected;        //Get various information about the connection        COMSTAT status;        //Keep track of last error        DWORD errors;    public:        //Initialize Serial communication with the given COM port        Serial(char *portName);        //Close the connection        ~Serial();        //Read data in a buffer, if nbChar is greater than the        //maximum number of bytes available, it will return only the        //bytes available. The function return -1 when nothing could        //be read, the number of bytes actually read.        int ReadData(char *buffer, unsigned int nbChar);        //Writes data from a buffer through the Serial connection        //return true on success.        bool WriteData(char *buffer, unsigned int nbChar);        //Check if we are actually connected        bool IsConnected();};#endif // SERIALCLASS_H_INCLUDED

Serial.cpp (source code file)

源文件,导入到工程源文件目录

#include "SerialClass.h"Serial::Serial(char *portName){    //We're not yet connected    this->connected = false;    //Try to connect to the given port throuh CreateFile    this->hSerial = CreateFile(portName,            GENERIC_READ | GENERIC_WRITE,            0,            NULL,            OPEN_EXISTING,            FILE_ATTRIBUTE_NORMAL,            NULL);    //Check if the connection was successfull    if(this->hSerial==INVALID_HANDLE_VALUE)    {        //If not success full display an Error        if(GetLastError()==ERROR_FILE_NOT_FOUND){            //Print Error if neccessary            printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName);        }        else        {            printf("ERROR!!!");        }    }    else    {        //If connected we try to set the comm parameters        DCB dcbSerialParams = {0};        //Try to get the current        if (!GetCommState(this->hSerial, &dcbSerialParams))        {            //If impossible, show an error            printf("failed to get current serial parameters!");        }        else        {            //Define serial connection parameters for the arduino board            dcbSerialParams.BaudRate=CBR_9600;            dcbSerialParams.ByteSize=8;            dcbSerialParams.StopBits=ONESTOPBIT;            dcbSerialParams.Parity=NOPARITY;            //Setting the DTR to Control_Enable ensures that the Arduino is properly            //reset upon establishing a connection            dcbSerialParams.fDtrControl = DTR_CONTROL_ENABLE;             //Set the parameters and check for their proper application             if(!SetCommState(hSerial, &dcbSerialParams))             {                printf("ALERT: Could not set Serial Port parameters");             }             else             {                 //If everything went fine we're connected                 this->connected = true;                 //Flush any remaining characters in the buffers                  PurgeComm(this->hSerial, PURGE_RXCLEAR | PURGE_TXCLEAR);                 //We wait 2s as the arduino board will be reseting                 Sleep(ARDUINO_WAIT_TIME);             }        }    }}Serial::~Serial(){    //Check if we are connected before trying to disconnect    if(this->connected)    {        //We're no longer connected        this->connected = false;        //Close the serial handler        CloseHandle(this->hSerial);    }}int Serial::ReadData(char *buffer, unsigned int nbChar){    //Number of bytes we'll have read    DWORD bytesRead;    //Number of bytes we'll really ask to read    unsigned int toRead;    //Use the ClearCommError function to get status info on the Serial port    ClearCommError(this->hSerial, &this->errors, &this->status);    //Check if there is something to read    if(this->status.cbInQue>0)    {        //If there is we check if there is enough data to read the required number        //of characters, if not we'll read only the available characters to prevent        //locking of the application.        if(this->status.cbInQue>nbChar)        {            toRead = nbChar;        }        else        {            toRead = this->status.cbInQue;        }        //Try to read the require number of chars, and return the number of read bytes on success        if(ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0)        {            return bytesRead;        }    }    //If nothing has been read, or that an error was detected return -1    return -1;}bool Serial::WriteData(char *buffer, unsigned int nbChar){    DWORD bytesSend;    //Try to write the buffer on the Serial port    if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0))    {        //In case it don't work get comm error and return false        ClearCommError(this->hSerial, &this->errors, &this->status);        return false;    }    else        return true;}bool Serial::IsConnected(){    //Simply return the connection status    return this->connected;}

调用方法

#include <stdio.h>#include <tchar.h>#include "SerialClass.h"    // Library described above#include <string>// application reads from the specified serial port and reports the collected dataint _tmain(int argc, _TCHAR* argv[]){    printf("Welcome to the serial test app!\n\n");    Serial* SP = new Serial("\\\\.\\COM10");    // adjust as needed    if (SP->IsConnected())        printf("We're connected");    char incomingData[256] = "";            // don't forget to pre-allocate memory    //printf("%s\n",incomingData);    int dataLength = 256;    int readResult = 0;    while(SP->IsConnected())    {        readResult = SP->ReadData(incomingData,dataLength);        printf("Bytes read: (-1 means no data available) %i\n",readResult);        std::string test(incomingData);        printf("%s",incomingData);        test = "";        Sleep(500);    }    return 0;}

几个注意

Serial* SP = new Serial("\\\\.\\COM10"); // adjust as needed

1

对于COM9号口以上需要\\\\.\\COM10
来调用该口。

对于COM0~COM9号直接以("COM0")
调用即可。

参考此处

http://www.cnblogs.com/ezhong/archive/2011/04/08/2171481.html

2 UNIFORM编码方式不支持CreateFile()函数

UNIFORM编码方式不支持Create()函数,需要以_T()进行转换。

CreateFile(_T("COM3:"),        GENERIC_READ | GENERIC_WRITE,        0,        NULL,        OPEN_EXISTING,        FILE_ATTRIBUTE_NORMAL,        NULL);
0 0
原创粉丝点击