当前位置: 首页 > news >正文

[]C/C++读取串口接收到的数据程序

原文地址: C/C++读取串口接收到的数据程序 作者: 半岛鱼

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void usage(void);
void set_up_serial_port(HANDLE h, long baud);
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length);
int main(int argc, char **argv)
{
HANDLE serial_port;    
long baud_rate = 9600;   
char port_name[] = "COM1:";  
unsigned long file_size;  
unsigned long bytes_received; 
unsigned long file_name_size; 
char file_name[256];   
if (argc == 3)
{
  if (argv[1][1] != 'b' || sscanf(argv[2], "%ld", &baud_rate) != 1)
  {
   usage();
   exit(0);
  }
}
else if (argc != 1)
{
  usage();
  exit(0);
}
serial_port = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (serial_port == INVALID_HANDLE_VALUE)
{
  fprintf(stderr, "Error opening portn");
  CloseHandle(serial_port);
  exit(0);
}
set_up_serial_port(serial_port, baud_rate);
ReadFile(serial_port, (void *)&file_name_size, sizeof(unsigned long), &bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
  fprintf(stderr, "Error getting file name size.n");
  CloseHandle(serial_port);
  exit(0);
}
ReadFile(serial_port, (void *)file_name, file_name_size, &bytes_received, NULL);
if (bytes_received != file_name_size)
{
  fprintf(stderr, "Error retrieving file name.n");
  CloseHandle(serial_port);
  exit(0);
}
file_name[bytes_received] = ' ';
ReadFile(serial_port, (void *)&file_size, sizeof(unsigned long), &bytes_received, NULL);
if (bytes_received != sizeof(unsigned long))
{
  fprintf(stderr, "Error getting file size.n");
  CloseHandle(serial_port);
  exit(0);
}
get_file_from_serial_port(serial_port, file_name, file_size);
printf("n%lu bytes successfully received and saved as %sn", file_size, file_name);
CloseHandle(serial_port);
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage:n");
fprintf(stderr, "tserrecv [-b baud rate]n");
fprintf(stderr, "tDefault baud rate is 9600n");
fprintf(stderr, "tSupported baud rates: 1200, 2400, 4800, 9600, 14400, 19200n");
return;
}
void set_up_serial_port(HANDLE h, long baud)
{
DCB properties;  
GetCommState(h, &properties);
switch(baud)
{
case 1200:
  properties.BaudRate = CBR_1200;
  break;
case 2400:
  properties.BaudRate = CBR_2400;
  break;
case 4800:
  properties.BaudRate = CBR_4800;
  break;
case 9600:
  properties.BaudRate = CBR_9600;
  break;
case 14400:
  properties.BaudRate = CBR_14400;
  break;
case 19200:
  properties.BaudRate = CBR_19200;
  break;
case 38400:
  properties.BaudRate = CBR_38400;
  break;
default:
  fprintf(stderr, "Invalid baud rate: %ldn", baud);
  usage();
  exit(0);
  break;
}
properties.Parity = NOPARITY;
properties.ByteSize = 8;
properties.StopBits = ONESTOPBIT;
SetCommState(h, &properties);
return;
}
void get_file_from_serial_port(HANDLE h, char *file_name, unsigned long file_length)
{
FILE *data_file;     
unsigned long bytes_left = file_length;
unsigned long bytes_received_total = 0;
unsigned long bytes_to_receive;  
unsigned long bytes_received;  
char buffer[200];     
data_file = fopen(file_name, "wb");
if (data_file == NULL)
{
  fprintf(stderr, "Could not create file %sn", file_name);
  CloseHandle(h);
  exit(0);
}
while (1)
{
  if (bytes_left == 0)
  {
   break;
  }
  else if (bytes_left < 200)
  {
   bytes_to_receive = bytes_left;
  }
  else
  {
   bytes_to_receive = 200;
  }
  ReadFile(h, (void *)buffer, bytes_to_receive, &bytes_received, NULL);
  if (bytes_received != bytes_to_receive)
  {
   fprintf(stderr, "Error reading file.n");
   CloseHandle(h);
   exit(0);
  }
  fwrite((void *)buffer, 1, bytes_received, data_file);
  bytes_left -= bytes_received;
  bytes_received_total += bytes_received;
  printf("r%5lu bytes received.", bytes_received_total);
}
fclose(data_file);
return;
}

相关文章:

  • []sim300 GPRS数据收发程序
  • []Telit UC864E 拨号上网
  • []常用AT命令解释()
  • []error LNK2001: unresolved external symbol _m
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • []我的函数库
  • 波分复用(WDM) 技术和概念
  • 2011年05月21日 男人成熟气质磨练
  • 【MSP430时钟】MSP430 5438时钟系统介绍
  • MSP 430 心得体会
  • MSP430X5XX的时钟系统与低功耗模式
  • MSP430:P1OUT=4、P1OUT |=4、P1OUT -=~8的意思
  • 【开关中断】MSP430 怎么开关中断,开关中断的代码|命令。
  • P3DIR|=BIT0、P3OUT=~BIT0  的含义
  • MSP430 5438 单片机学习笔记(鱼香茄子)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • angular组件开发
  • es6(二):字符串的扩展
  • JavaWeb(学习笔记二)
  • js继承的实现方法
  • js学习笔记
  • MySQL用户中的%到底包不包括localhost?
  • quasar-framework cnodejs社区
  • Spring Boot快速入门(一):Hello Spring Boot
  • Spring Cloud中负载均衡器概览
  • v-if和v-for连用出现的问题
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云购买磁盘后挂载
  • 当SetTimeout遇到了字符串
  • 每天一个设计模式之命令模式
  • 面试遇到的一些题
  • 浅谈Golang中select的用法
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #{}和${}的区别?
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $jQuery 重写Alert样式方法
  • (C语言)字符分类函数
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (二)JAVA使用POI操作excel
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net 生成二级域名
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET下ASPX编程的几个小问题
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .Net中wcf服务生成及调用
  • @staticmethod和@classmethod的作用与区别
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [Assignment] C++1