关键词:win环境 C语言 串口通信 ChatGPT
1.ChatGPT
- com<=com9可以用直接赋值 COMx
- com>com9需要 \\\\.\\COMx
重点//eg:COM1,COM2 ······, COM10 use \\\\.\\COM10
ChatGPT:Write a serial communication using c in win
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hSerial;
DCB dcbSerialParams = {0};
COMMTIMEOUTS timeouts = {0};
char port[] = "COM1"; // specify the COM port you want to use
DWORD bytes_written, bytes_read;
char data[] = "Hello world!"; // data to send
char incoming_data[256]; // buffer to store incoming data
int i;
// open the serial port
hSerial = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Error opening serial port.\n");
return 1;
}
// set the serial port parameters
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("Error getting serial port state.\n");
CloseHandle(hSerial);
return 1;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
printf("Error setting serial port state.\n");
CloseHandle(hSerial);
return 1;
}
// set the timeouts
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hSerial, &timeouts)) {
printf("Error setting timeouts.\n");
CloseHandle(hSerial);
return 1;
}
// send data
if (!WriteFile(hSerial, data, sizeof(data), &bytes_written, NULL)) {
printf("Error writing to serial port.\n");
CloseHandle(hSerial);
return 1;
}
printf("Sent %d bytes: %s\n", bytes_written, data);
// read incoming data
if (!ReadFile(hSerial, incoming_data, sizeof(incoming_data), &bytes_read, NULL)) {
printf("Error reading from serial port.\n");
CloseHandle(hSerial);
return 1;
}
printf("Received %d bytes: ", bytes_read);
for (i = 0; i < bytes_read; i++) {
printf("%c", incoming_data[i]);
}
printf("\n");
// close the serial port
CloseHandle(hSerial);
return 0;
}
2.对ChatGPT进行代码封装
main.c
#include <windows.h>
#include <stdio.h>
#include "serial.h"
int main()
{
const char* com = "\\\\.\\COM10";
char data[] = "maosql\r\nHello world!\r\n"; // data to send
wq_open_serial_port(com, CBR_115200);
wq_serial_port_write(data, sizeof(data));
wq_serial_port_read();
wq_close_serial_port();
}
- serial.h
#ifndef __SERIAL_H__
#define __SERIAL_H__
HANDLE wq_open_serial_port(const char* com, int BaudRate);
void wq_close_serial_port(void);
HANDLE wq_serial_port_write(char* data, UINT32 date_len);
HANDLE wq_serial_port_read(void);
#endif
- serial.c
#include <windows.h>
#include <stdio.h>
HANDLE hSerial;
HANDLE comHandle = INVALID_HANDLE_VALUE;
DWORD bytes_written, bytes_read;
char incoming_data[256]; // buffer to store incoming data
/*
* param com: //eg:COM1,COM2 , >COM9 use \\\\.\\COMx
* param BaudRate: //Common value:CBR_9600、CBR_19200、CBR_38400、CBR_115200、CBR_230400、CBR_460800
*/
HANDLE wq_open_serial_port(const char* com, int BaudRate)
{
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
// open the serial port
hSerial = CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hSerial == INVALID_HANDLE_VALUE) {
printf("Error opening serial port.\n");
return comHandle;
}
// get the serial port parameters
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams)) {
printf("Error getting serial port state.\n");
CloseHandle(hSerial);
return comHandle;
}
dcbSerialParams.BaudRate = BaudRate;
dcbSerialParams.Parity = NOPARITY;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
// set the serial port parameters
if (!SetCommState(hSerial, &dcbSerialParams)) {
printf("Error setting serial port state.\n");
CloseHandle(hSerial);
return comHandle;
}
// set the timeouts
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hSerial, &timeouts)) {
printf("Error setting timeouts.\n");
CloseHandle(hSerial);
return comHandle;
}
return 0;
}
void wq_close_serial_port(void)
{
// close the serial port
CloseHandle(hSerial);
}
HANDLE wq_serial_port_write(char* data, UINT32 date_len)
{
// send data
if (!WriteFile(hSerial, data, date_len, &bytes_written, NULL)) {
printf("Error writing to serial port.\n");
CloseHandle(hSerial);
return comHandle;
}
printf("Sent %d bytes: %s\n", bytes_written, data);
return 0;
}
HANDLE wq_serial_port_read(void)
{
UINT32 i;
// read incoming data
if (!ReadFile(hSerial, incoming_data, sizeof(incoming_data), &bytes_read, NULL)) {
printf("Error reading from serial port.\n");
CloseHandle(hSerial);
return comHandle;
}
printf("Received %d bytes: ", bytes_read);
for (i = 0; i < bytes_read; i++) {
printf("%c", incoming_data[i]);
}
printf("\n");
return 0;
}