WIN10操作C串口--OTA下篇

参考:
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才可以 二进制

++++windows上实现vscode编译多个c源文件

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"
}

全部代码 视频

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值