c语言windows下串口收发(别人那叠加!!)

系列文章目录


前言

前篇文章讲到了在linux下进行串口收发,但是在windows下并没有
#include <termios.h> 这个库,所以windos下秉性另外一套串口设置的库
,其中主要用到了#include <windows.h> ,链接: link
借用这位大佬的demo进行讲解,但是不知为啥,至少在codeblock中,因为要加上一行

一、pandas是什么?

#include <stdio.h>
#include <windows.h>
#include <string.h>
 
#if 1   //开启DEBUG打印
#define LOGD(...) printf(__VA_ARGS__)
#else   //关闭DEBUG打印
#define LOGD(...)
#endif
 
#if 1   //开启ERROR打印
#define LOGE(...) printf(__VA_ARGS__)
#else   //关闭ERROR打印
#define LOGE(...)
#endif
 
//缓冲区大小
#define BUF_SIZE    2048
#define EXIT_STR    "exit"
#define I_EXIT      "I exit.\r\n"
#define I_RECEIVE   "I receive.\r\n"
 
//打开串口
HANDLE OpenSerial(const char *com, //串口名称,如COM1,COM2
    int baud,       //波特率:常用取值:CBR_9600、CBR_19200、CBR_38400、CBR_115200、CBR_230400、CBR_460800
    int byteSize,   //数位大小:可取值7、8;
    int parity,     //校验方式:可取值NOPARITY、ODDPARITY、EVENPARITY、MARKPARITY、SPACEPARITY
    int stopBits)   //停止位:ONESTOPBIT、ONE5STOPBITS、TWOSTOPBITS;
{    
    DCB dcb;
    BOOL b = FALSE;
	COMMTIMEOUTS CommTimeouts;	
    HANDLE comHandle = INVALID_HANDLE_VALUE;
 
    //打开串口
	comHandle = CreateFile(com,            //串口名称
		GENERIC_READ | GENERIC_WRITE,      //可读、可写   				 
		0,            // No Sharing                               
		NULL,         // No Security                              
		OPEN_EXISTING,// Open existing port only                     
		FILE_ATTRIBUTE_NORMAL,            // Non Overlapped I/O                           
		NULL);        // Null for Comm Devices
 
	if (INVALID_HANDLE_VALUE == comHandle) {
        LOGE("CreateFile fail\r\n");
        return comHandle;
    }
 
    // 设置读写缓存大小
	b = SetupComm(comHandle, BUF_SIZE, BUF_SIZE);
    if (!b) {
        LOGE("SetupComm fail\r\n");
    }
 
    //设定读写超时
	CommTimeouts.ReadIntervalTimeout = MAXDWORD;//读间隔超时
	CommTimeouts.ReadTotalTimeoutMultiplier = 0;//读时间系数
	CommTimeouts.ReadTotalTimeoutConstant = 0;//读时间常量
	CommTimeouts.WriteTotalTimeoutMultiplier = 1;//写时间系数
	CommTimeouts.WriteTotalTimeoutConstant = 1;//写时间常量
	b = SetCommTimeouts(comHandle, &CommTimeouts); //设置超时
    if (!b) {
        LOGE("SetCommTimeouts fail\r\n");
    }
 
    //设置串口状态属性
    GetCommState(comHandle, &dcb);//获取当前
	dcb.BaudRate = baud; //波特率
	dcb.ByteSize = byteSize; //每个字节有位数
	dcb.Parity   = parity; //无奇偶校验位
	dcb.StopBits = stopBits; //一个停止位
	b = SetCommState(comHandle, &dcb);//设置
    if (!b) {
        LOGE("SetCommState fail\r\n");
    }
 
    return comHandle;
}
 
int main(int argc, char *argv[])
{
    BOOL b = FALSE;
    DWORD wRLen = 0;
    DWORD wWLen = 0;
    char buf[BUF_SIZE] = {0};
	HANDLE comHandle = INVALID_HANDLE_VALUE;//串口句柄    	
 
    //打开串口
    const char *com = "COM2";
	comHandle = OpenSerial(com, CBR_9600, 8, NOPARITY, ONESTOPBIT);
	if (INVALID_HANDLE_VALUE == comHandle) {
		LOGE("OpenSerial COM2 fail!\r\n");
		return -1;
	}
	LOGD("Open COM2 Successfully!\r\n");
 
    //循环接收消息,收到消息后将消息内容打印并回复I_RECEIVE, 如果收到EXIT_STR就回复EXIT_STR并退出循环
	while (1) {
		wRLen = 0;
        //读串口消息
		b = ReadFile(comHandle, buf, sizeof(buf)-1, &wRLen, NULL);
		if (b && 0 < wRLen) {//读成功并且数据大小大于0
            buf[wRLen] = '\0';
            LOGD("[RECV]%s\r\n", buf);//打印收到的数据
            if (0 == strncmp(buf, EXIT_STR, strlen(EXIT_STR))) {
                //回复
                b = WriteFile(comHandle, TEXT(I_EXIT), strlen(I_EXIT), &wWLen, NULL);
                if (!b) {
                    LOGE("WriteFile fail\r\n");
                }
                break;
            }
            //回复
			b = WriteFile(comHandle, TEXT(I_RECEIVE), strlen(I_RECEIVE), &wWLen, NULL);
            if (!b) {
                LOGE("WriteFile fail\r\n");
            }
		}
	}
 
    //关闭串口
	b = CloseHandle(comHandle);
    if (!b) {
        LOGE("CloseHandle fail\r\n");
    }
 
    LOGD("Program Exit.\r\n");
    return 0;
}

二、使用步骤

1.打开串口

代码如下(示例):

//打开串口
HANDLE OpenSerial(const char *com, //串口名称,如COM1,COM2
    int baud,       //波特率:常用取值:CBR_9600、CBR_19200、CBR_38400、CBR_115200、CBR_230400、CBR_460800
    int byteSize,   //数位大小:可取值7、8;
    int parity,     //校验方式:可取值NOPARITY、ODDPARITY、EVENPARITY、MARKPARITY、SPACEPARITY
    int stopBits)   //停止位:ONESTOPBIT、ONE5STOPBITS、TWOSTOPBITS;
{
    DCB dcb;
    BOOL b = FALSE;
	COMMTIMEOUTS CommTimeouts;
    HANDLE comHandle = INVALID_HANDLE_VALUE;
    TCHAR comname[100]; 
    //打开串口
    sprintf(comname,"\\\\.\\%s",com);
	comHandle = CreateFile(comname,            //串口名称
		GENERIC_READ | GENERIC_WRITE,      //可读、可写
		0,            // No Sharing
		NULL,         // No Security
		OPEN_EXISTING,// Open existing port only
		FILE_ATTRIBUTE_NORMAL,            // Non Overlapped I/O
		NULL);        // Null for Comm Devices

	if (INVALID_HANDLE_VALUE == comHandle) {
        LOGE("CreateFile fail\r\n");
        return NULL;
    } 
    // 设置读写缓存大小
	b = SetupComm(comHandle, BUF_SIZE, BUF_SIZE);
    if (!b) {
        LOGE("SetupComm fail\r\n");
    } 
    //设定读写超时
	CommTimeouts.ReadIntervalTimeout = MAXDWORD;//读间隔超时
	CommTimeouts.ReadTotalTimeoutMultiplier = 0;//读时间系数
	CommTimeouts.ReadTotalTimeoutConstant = 0;//读时间常量
	CommTimeouts.WriteTotalTimeoutMultiplier = 1;//写时间系数
	CommTimeouts.WriteTotalTimeoutConstant = 1;//写时间常量
	b = SetCommTimeouts(comHandle, &CommTimeouts); //设置超时
    if (!b) {
        LOGE("SetCommTimeouts fail\r\n");
    } 
    //设置串口状态属性
    GetCommState(comHandle, &dcb);//获取当前
	dcb.BaudRate = baud; //波特率
	dcb.ByteSize = byteSize; //每个字节有位数
	dcb.Parity   = parity; //无奇偶校验位
	dcb.StopBits = stopBits; //一个停止位
	b = SetCommState(comHandle, &dcb);//设置
    if (!b) {
        LOGE("SetCommState fail\r\n");
    } 
    return comHandle;
} 

2.即在creatfile前加上

sprintf(comname,“\\.\%s”,com);

收发的话就是

int b = ReadFile(COM1, buf, sizeof(buf)-1, &wRLen, NULL);
            buf[wRLen] = '\0';
            if (b && 0 < wRLen) {//读成功并且数据大小大于0
            	///
            }
#
 int b = WriteFile(COM1, TEXT(data), strlen(data), &wWLen, NULL);
        printf("send_state  %s\n",data );

另外一个博文

链接: link

#include <stdio.h>
#include "serial.h"
#include <windows.h>

int serial_test()
{
    PORT COM1;
    char buff[1024] = {0};
    int rcv_len = 0;

    printf("open com1\n");
    COM1 = serial_init(1, 115200, 8, 1, 0);

    while(1)
    {
        Serial_SendData(COM1, "hello guoguo\n", 13);
        memset(buff, 0, 1024);
        rcv_len = Serial_ReciveData(COM1, buff, 1024);
        printf("rcv:%s\n", buff);
        Sleep(1);
    }
}
int main()
{
    serial_test();
    while (1)
    {
    }

    return 0;
}

#include <stdio.h>
#include <windows.h>
#include "serial.h"

PORT OpenPort(int idx)
{
	HANDLE hComm;
	TCHAR comname[100];
	wsprintf(comname, TEXT("\\\\.\\COM%d"), idx);
	hComm = CreateFile(comname,            //port name 
		GENERIC_READ | GENERIC_WRITE, //Read/Write   				 
		0,            // No Sharing                               
		NULL,         // No Security                              
		OPEN_EXISTING,// Open existing port only                     
		0,            // Non Overlapped I/O                           
		NULL);        // Null for Comm Devices
	
	if (hComm == INVALID_HANDLE_VALUE)
		return NULL;
	COMMTIMEOUTS timeouts = { 0 };
	timeouts.ReadIntervalTimeout = 50;
	timeouts.ReadTotalTimeoutConstant = 50;
	timeouts.ReadTotalTimeoutMultiplier = 10;
	timeouts.WriteTotalTimeoutConstant = 50;
	timeouts.WriteTotalTimeoutMultiplier = 10;

	if (SetCommTimeouts(hComm, &timeouts) == FALSE)
		return NULL;

	if (SetCommMask(hComm, EV_RXCHAR) == FALSE)
		return NULL;

	printf("open%d ok\n",idx);

	return hComm;
}

void ClosePort(PORT com_port)
{
	CloseHandle(com_port);
}

int SetPortBoudRate(PORT com_port, int rate)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return FALSE;
	dcbSerialParams.BaudRate = rate;
	Status = SetCommState(com_port, &dcbSerialParams);
	return Status;
}

int SetPortDataBits(PORT com_port, int bits)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return FALSE;
	dcbSerialParams.ByteSize = bits;
	Status = SetCommState(com_port, &dcbSerialParams);
	return Status;
}

int SetPortStopBits(PORT com_port, int bits)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return FALSE;
	dcbSerialParams.StopBits = bits;
	Status = SetCommState(com_port, &dcbSerialParams);
	return Status;
}

//默认为无校验。NOPARITY 0; ODDPARITY 1;EVENPARITY 2;MARKPARITY 3;SPACEPARITY 4
int SetPortParity(PORT com_port, int parity)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return FALSE;
	dcbSerialParams.Parity = parity;
	Status = SetCommState(com_port, &dcbSerialParams);
	return Status;
}

int GetPortBoudRate(PORT com_port)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return -1;
	return dcbSerialParams.BaudRate;
}

int GetPortDataBits(PORT com_port) 
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return -1;
	return dcbSerialParams.ByteSize;
}

int GetPortStopBits(PORT com_port) 
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return -1;
	return dcbSerialParams.StopBits;
}

int GetPortParity(PORT com_port)
{
	DCB dcbSerialParams = { 0 };
	BOOL Status;
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	Status = GetCommState(com_port, &dcbSerialParams);
	if (Status == FALSE)
		return -1;
	return dcbSerialParams.Parity;
}

int SendData(PORT com_port, const char * data)
{
	DWORD  dNoOFBytestoWrite = strlen(data);
	DWORD  dNoOfBytesWritten;
	BOOL Status = WriteFile(com_port,
				data,
				dNoOFBytestoWrite,
				&dNoOfBytesWritten,
				NULL);
	if (Status == FALSE)
	{
			return -1;
	}
	else
	{
		printf("%s\n",data);
	}

	return dNoOfBytesWritten;
}

int ReciveData(PORT com_port, char * data,int len)
{
	DWORD dwEventMask;
	DWORD NoBytesRead;

	BOOL Status = WaitCommEvent(com_port, &dwEventMask, NULL);
	if (Status == FALSE) 
    {
		return FALSE;
	}
	Status = ReadFile(com_port, data, len, &NoBytesRead, NULL);
	data[NoBytesRead] = 0;

	if (Status == FALSE) 
    {
		return FALSE;
	}
	else
    {
		printf("%s\n",data);
	}

	return TRUE;
}

PORT serial_init(int idx, int rate, int databits, int stopbits, int parity)
{
    int ret = 0;
   PORT com_port;
   com_port = OpenPort(idx);
   if (com_port == INVALID_HANDLE_VALUE)
   {
       printf("open COM%d fail\n", idx);
       return NULL;
   }
   ret = SetPortBoudRate(com_port, rate);
   if(ret == FALSE)
   {
       printf("set COM%d band fail\n", idx);
       return NULL;
   }
   ret = SetPortDataBits(com_port, databits);
   if(ret == FALSE)
   {
       printf("set COM%d databits fail\n", idx);
       return NULL;
   }
   stopbits = ONESTOPBIT;
   printf("stopbits %d\n",stopbits);
   ret = SetPortStopBits(com_port, stopbits);
   if(ret == FALSE)
   {
       printf("set COM%d stopbits fail\n", idx);
       return NULL;
   }
   ret = SetPortParity(com_port, parity);
   if(ret == FALSE)
   {
       printf("set COM%d parity fail\n", idx);
       return NULL;
   }

   return com_port;
}

int Serial_SendData(PORT com_port, const char *data, int len)
{
    DWORD  dNoOfBytesWritten;
    BOOL Status = WriteFile(com_port,
				data,
				len,
				&dNoOfBytesWritten,
				NULL);

	if (Status == FALSE)
		return -1;
	else
		printf("send ok\n");

    return 0;
}

int Serial_ReciveData(PORT com_port, char * data, int len)
{
	DWORD dwEventMask;
	DWORD NoBytesRead;

	BOOL Status = WaitCommEvent(com_port, &dwEventMask, NULL);
	if (Status == FALSE) 
    {
		return -1;
	}
	Status = ReadFile(com_port, data, len, &NoBytesRead, NULL);
	data[NoBytesRead] = 0;

	if (Status == FALSE) 
		return -1;
	else
		printf("rcv ok\n");

	return NoBytesRead;
}

#ifndef __SERIAL_H
#define __SERIAL_H
#include <windows.h>
typedef HANDLE PORT;

PORT OpenPort(int idx);
void ClosePort(PORT com_port);
int SetPortBoudRate(PORT com_port, int rate);
int SetPortDataBits(PORT com_port, int bits);
int SetPortStopBits(PORT com_port, int bits);
int SetPortParity(PORT com_port, int parity);
int GetPortBoudRate(PORT com_port);
int GetPortDataBits(PORT com_port);
int GetPortStopBits(PORT com_port);
int GetPortParity(PORT com_port);
int SendData(PORT com_port, const char * data);
int ReciveData(PORT com_port, char * data,int len);
PORT serial_init(int idx, int rate, int databits, int stopbits, int parity);
int Serial_SendData(PORT com_port, const char *data, int len);
int Serial_ReciveData(PORT com_port, char *data, int len);

#endif

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值