参考:
windows c编写串口通信_锅锅的博客-CSDN博客_c语言windows串口通信
第一步C环境
#include <stdio.h>
int main()
{
printf("HELLO\n");
while (1)
{
}
return 0;
}
可以输出
第二部 博文的代码拿过来
#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 koson\n", 12);
memset(buff, 0, 1024);
rcv_len = Serial_ReciveData(COM1, buff, 1024);
printf("rcv:%s\n", buff);
Sleep(1);
}
}
int main()
{
printf("HELLO\n");
serial_test();
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;
}
//榛樿�や负鏃犳牎楠屻€侼OPARITY 0锛� ODDPARITY 1锛汦VENPARITY 2锛汳ARKPARITY 3锛汼PACEPARITY 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
此时VSCODE不能编译 用CMD
最后执行a.exe 启动虚拟串口和COM2收发
++++++++继续增加JS的解析
#include <stdio.h>
#include <windows.h>
#include "serial.h"
#include "cJSON.h"
#define MUST_TRUE(p) \
do { \
if(NULL == p) \
{\
cJSON_Delete(pRoot);\
return 1;\
}\
}while(0);
typedef struct _otaStartType
{
int filesize;
char md5[32+1];
int ver;
}otaStartType;
char ota_start(char *pJson)
{
otaStartType otaStart;
memset(&otaStart, 0, sizeof(otaStartType));
cJSON * pRoot = cJSON_Parse(pJson);MUST_TRUE(pRoot);
cJSON * pSub = cJSON_GetObjectItem(pRoot, "filesize");MUST_TRUE(pSub);
otaStart.filesize = pSub->valueint;
pSub = cJSON_GetObjectItem(pRoot, "md5");MUST_TRUE(pSub);
sprintf(otaStart.md5,"%.32s",pSub->valuestring);
pSub = cJSON_GetObjectItem(pRoot, "ver");MUST_TRUE(pSub);
otaStart.ver = pSub->valueint;
printf("otaStart.filesize [%d]\n",otaStart.filesize);
printf("otaStart.md5 [%s]\n",otaStart.md5);
printf("otaStart.ver [%d]\n",otaStart.ver);
return 0;
}
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 koson\n", 12);
memset(buff, 0, 1024);
rcv_len = Serial_ReciveData(COM1, buff, 1024);
printf("rcv:%s\n", buff);
ota_start(buff);
Sleep(1);
}
}
int main()
{
printf("HELLO\n");
serial_test();
return 0;
}
JS的模块是嵌入式的
===直接完成GO 的配对的工程
#include <stdio.h>
#include <windows.h>
#include "serial.h"
#include "cJSON.h"
#define MUST_TRUE(p) \
do { \
if(NULL == p) \
{\
cJSON_Delete(pRoot);\
return 1;\
}\
}while(0);
typedef struct _otaStartType
{
int filesize;
char md5[32+1];
int ver;
}otaStartType;
typedef struct _otaStartingType
{
int addr;
int len;
}otaStartingType;
#define OTA_ONE_STEP 2048
PORT COM1;
otaStartType otaStart;
otaStartingType otaStarting;
const char* OUTPUT_BIN_NAME = "out.bin";
char wait_ota_start(char *pJson)
{
memset(&otaStart, 0, sizeof(otaStartType));
memset(&otaStarting, 0, sizeof(otaStartType));
cJSON * pRoot = cJSON_Parse(pJson);MUST_TRUE(pRoot);
cJSON * pSub = cJSON_GetObjectItem(pRoot, "filesize");MUST_TRUE(pSub);
otaStart.filesize = pSub->valueint;
pSub = cJSON_GetObjectItem(pRoot, "md5");MUST_TRUE(pSub);
sprintf(otaStart.md5,"%.32s",pSub->valuestring);
pSub = cJSON_GetObjectItem(pRoot, "ver");MUST_TRUE(pSub);
otaStart.ver = pSub->valueint;
printf("otaStart.filesize [%d]\n",otaStart.filesize);
printf("otaStart.md5 [%s]\n",otaStart.md5);
printf("otaStart.ver [%d]\n",otaStart.ver);
return 0;
}
char save_ota_file(unsigned char *data,int datalen)
{
FILE *fp;
fp = fopen(OUTPUT_BIN_NAME, "ab+");
if (NULL == fp){ printf("NULL == fp");return 1 ;}
printf("datalen=%d\r\n",datalen);
fwrite(data, sizeof(char), datalen, fp);
fclose(fp);
return 0 ;
}
char send_hb[128];
void send_ota_duty(int duty,int errflag)
{
cJSON *root = NULL;
char *outStr;
root = cJSON_CreateObject();
cJSON_AddNumberToObject(root,"duty", duty);
cJSON_AddNumberToObject(root,"errflag", errflag) ;
outStr = cJSON_Print(root);
cJSON_Delete(root);
memset(send_hb,0,128);
send_hb[0]='#';
send_hb[1]='4';
memcpy(&send_hb[2],outStr,strlen(outStr));
Serial_SendData(COM1, send_hb, strlen(outStr)+2);
//Serial_SendData(COM1, outStr, strlen(outStr));
//printf("TX [%s]\n",send_hb);
}
void send_ota_ask(otaStartingType info)
{
cJSON *root = NULL;
char *outStr;
root = cJSON_CreateObject();
cJSON_AddNumberToObject(root,"addr", info.addr);
cJSON_AddNumberToObject(root,"len", info.len) ;
outStr = cJSON_Print(root);
cJSON_Delete(root);
//Serial_SendData(COM1, outStr, strlen(outStr));
memset(send_hb,0,128);
send_hb[0]='#';
send_hb[1]='2';
memcpy(&send_hb[2],outStr,strlen(outStr));
Serial_SendData(COM1, send_hb, strlen(outStr)+2);
printf(" TX [%d]\n",info.addr);
//printf("TX [%s]\n",send_hb);
}
int main()
{
char buff[OTA_ONE_STEP+10] = {0};
int rcv_len = 0;
printf("open com1\n");
COM1 = serial_init(1, 115200, 8, 1, 0);
remove(OUTPUT_BIN_NAME);
while(1)
{
memset(buff, 0, sizeof(buff));
rcv_len = Serial_ReciveData(COM1, buff, sizeof(buff));
//printf("rcv_len=%d rcv:%s\n",rcv_len, buff);
char head = buff[0];
char *body = &buff[1];
switch(head)
{
case '1':
if(0==wait_ota_start(body)) {
remove(OUTPUT_BIN_NAME);
otaStarting.addr=0;
otaStarting.len=OTA_ONE_STEP;
send_ota_ask(otaStarting);
}
break;
case '3':
if(rcv_len == otaStarting.len+1 ){//我发送说 我要otaStarting.len 你给我的是这个长度的body+一个字节的head
save_ota_file(body,otaStarting.len);
otaStarting.addr += otaStarting.len;
int file_leave = otaStart.filesize - otaStarting.addr;
if(file_leave > OTA_ONE_STEP){
otaStarting.len = OTA_ONE_STEP;
send_ota_ask(otaStarting);
}
else if(file_leave > 0){//最后一次请求 可能不足OTA_ONE_STEP
otaStarting.len = file_leave;
send_ota_ask(otaStarting);
printf("TX LAST ONE\n");
}
else if(file_leave == 0){//已经结束了
printf("RX LAST ONE\n");
}
int duty = (otaStarting.addr*100)/otaStart.filesize;
int errflag = 0;
send_ota_duty(duty,errflag);
}
break;
}
Sleep(1);
}
return 0;
}
错误笔记:
GO发过来的文件 最后 和我本地保存的文件 对比
发现本地保存的总是在0A前面 多一个0D
也就是文件变多了
问题是这里
用a+不行 他是文件 多一个B才可以 二进制
vscode编译C 一个工程
最后是不可以用鼠标右键的那个coderun
而是F5 或者ctrl+F5那个运行 可以的
它是自己配置的。vs文件
只需要修改task。js 他就是那个*.c == CMD的时候做的gccmain.c js.c 这样的
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "C:\\msys64\\mingw64\\bin\\gcc.exe",
"args": [
"-g",
"${cwd}//*.c",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
全部代码 视频