UART 串口示例代码
/* uart_tx.c */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>
#include <termios.h> #define TEST_LEN (1024 * 400)
static char *dev_name = "/dev/ttyS2";
static int baud_rate = ;
static struct option opts[] = {
{"device", required_argument, NULL, 'd'},
{"baud", required_argument, NULL, 'b'},
{"help", no_argument, NULL, 'h'},
}; static void parse_cmd(int argc, char *argv[])
{
int ch; while ((ch = getopt_long(argc, argv, "d:b:l:h", opts, NULL)) != -) {
switch (ch) {
case 'd':
//printf("dev_name: %s\n", optarg);
dev_name = optarg;
break;
case 'b':
//printf("baud_rate: %s\n", optarg);
baud_rate = atoi(optarg);
break;
case 'h':
printf("Usage: %s -d dev_name -b baud_rate\n", argv[]);
printf("like:\n");
printf("\t %s -d /dev/ttyS2\n", argv[]);
printf("\t %s --device /dev/ttyS2 -b 9600\n", argv[]);
break;
default:
printf("Unknown option or invalid format!\n");
printf("Pls: %s --help for more info\n", argv[]);
break;
}
}
} int set_serial(int fd, int baud_rate, int nBits, char nEvent, int nStop)
{
struct termios tty_cfg; memset(&tty_cfg, , sizeof(tty_cfg));
tty_cfg.c_cflag |= (CLOCAL|CREAD); /* CREAD 开启串行数据接收,CLOCAL并打开本地连接模式 */
tty_cfg.c_cflag &= ~CSIZE; /* 设置数据位 */ switch(baud_rate) {
case :
cfsetispeed(&tty_cfg, B2400);
cfsetospeed(&tty_cfg, B2400);
break;
case :
cfsetispeed(&tty_cfg, B4800);
cfsetospeed(&tty_cfg, B4800);
break;
case :
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
case :
cfsetispeed(&tty_cfg, B115200);
cfsetospeed(&tty_cfg, B115200);
break;
case :
cfsetispeed(&tty_cfg, B460800);
cfsetospeed(&tty_cfg, B460800);
break;
default:
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
} switch(nBits) {
case :
tty_cfg.c_cflag |= CS7;
break;
case :
tty_cfg.c_cflag |= CS8;
break;
} switch(nEvent) {
case '': /* 奇校验 */
tty_cfg.c_cflag |= PARENB; /* 开启奇偶校验 */
tty_cfg.c_iflag |= (INPCK | ISTRIP); /*INPCK打开输入奇偶校验;ISTRIP去除字符的第八个比特 */
tty_cfg.c_cflag |= PARODD; /*启用奇校验(默认为偶校验)*/
break;
case 'E': /*偶校验*/
tty_cfg.c_cflag |= PARENB; /*开启奇偶校验 */
tty_cfg.c_iflag |= ( INPCK | ISTRIP); /*打开输入奇偶校验并去除字符第八个比特*/
tty_cfg.c_cflag &= ~PARODD; /*启用偶校验*/
break;
case 'N': /*无奇偶校验*/
tty_cfg.c_cflag &= ~PARENB;
break;
} /* 设置停止位;若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB */
if(nStop == )
tty_cfg.c_cflag &= ~CSTOPB; /*默认为一位停止位; */
else if( nStop == )
tty_cfg.c_cflag |= CSTOPB; /* CSTOPB表示送两位停止位 */ /* flow control option */
tty_cfg.c_cflag |= CRTSCTS; /* 设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时*/
tty_cfg.c_cc[VTIME] = ; /* 非规范模式读取时的超时时间;*/
tty_cfg.c_cc[VMIN] = ; /* 非规范模式读取时的最小字符数*/
tcflush(fd, TCIFLUSH); /* tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不读取出来 */ /*激活配置使其生效*/
if((tcsetattr(fd, TCSANOW, &tty_cfg)) != ) {
printf("com set error");
exit();
} return ;
} char buff[TEST_LEN]; int main(int argc, char *argv[])
{
int fd=;
int cnt=;
int sum=;
static int num=;
char *p=NULL; parse_cmd(argc, argv);
printf("TX: dev_name=%s, baud_rate=%d\n", dev_name, baud_rate); fd = open(dev_name,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < ) {
printf("Can't Open %s\n", dev_name);
return -;
} set_serial(fd, baud_rate, , 'N', );
sleep(); memset(buff, 0x55, TEST_LEN);
//printf("start send: %ds\n", time(NULL));
p = &buff[];
while() {
cnt = write(fd, p, (TEST_LEN-sum));
if(cnt < ) {
//sleep(1);
continue;
}
sum += cnt;
if(sum >= TEST_LEN)
break;
p += cnt;
printf("TX%d: cnt = %d, sum = %d\n", num++, cnt, sum);
} printf("send %d: %ds\n", sum, time(NULL)); close(fd);
return ;
}
/* uart_rx.c */
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>
#include <termios.h> #define TEST_LEN (1024 * 400)
static char *dev_name = "/dev/ttyS2";
static int baud_rate = ;
static struct option opts[] = {
{"device", required_argument, NULL, 'd'},
{"baud", required_argument, NULL, 'b'},
{"help", no_argument, NULL, 'h'},
}; static void parse_cmd(int argc, char *argv[])
{
int ch; while ((ch = getopt_long(argc, argv, "d:b:l:h", opts, NULL)) != -) {
switch (ch) {
case 'd':
//printf("dev_name: %s\n", optarg);
dev_name = optarg;
break;
case 'b':
//printf("baud_rate: %s\n", optarg);
baud_rate = atoi(optarg);
break;
case 'h':
printf("Usage: %s -d dev_name -b baud_rate\n", argv[]);
printf("like:\n");
printf("\t %s -d /dev/ttyS2\n", argv[]);
printf("\t %s --device /dev/ttyS2 -b 9600\n", argv[]);
break;
default:
printf("Unknown option or invalid format!\n");
printf("Pls: %s --help for more info\n", argv[]);
break;
}
}
} int set_serial(int fd, int baud_rate, int nBits, char nEvent, int nStop)
{
struct termios tty_cfg; memset(&tty_cfg, , sizeof(tty_cfg));
tty_cfg.c_cflag |= (CLOCAL|CREAD); /* CREAD 开启串行数据接收,CLOCAL并打开本地连接模式 */
tty_cfg.c_cflag &= ~CSIZE; /* 设置数据位 */ switch(baud_rate) {
case :
cfsetispeed(&tty_cfg, B2400);
cfsetospeed(&tty_cfg, B2400);
break;
case :
cfsetispeed(&tty_cfg, B4800);
cfsetospeed(&tty_cfg, B4800);
break;
case :
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
case :
cfsetispeed(&tty_cfg, B115200);
cfsetospeed(&tty_cfg, B115200);
break;
case :
cfsetispeed(&tty_cfg, B460800);
cfsetospeed(&tty_cfg, B460800);
break;
default:
cfsetispeed(&tty_cfg, B9600);
cfsetospeed(&tty_cfg, B9600);
break;
} switch(nBits) {
case :
tty_cfg.c_cflag |= CS7;
break;
case :
tty_cfg.c_cflag |= CS8;
break;
} switch(nEvent) {
case '': /* 奇校验 */
tty_cfg.c_cflag |= PARENB; /* 开启奇偶校验 */
tty_cfg.c_iflag |= (INPCK | ISTRIP); /*INPCK打开输入奇偶校验;ISTRIP去除字符的第八个比特 */
tty_cfg.c_cflag |= PARODD; /*启用奇校验(默认为偶校验)*/
break;
case 'E': /*偶校验*/
tty_cfg.c_cflag |= PARENB; /*开启奇偶校验 */
tty_cfg.c_iflag |= ( INPCK | ISTRIP); /*打开输入奇偶校验并去除字符第八个比特*/
tty_cfg.c_cflag &= ~PARODD; /*启用偶校验*/
break;
case 'N': /*无奇偶校验*/
tty_cfg.c_cflag &= ~PARENB;
break;
} /* 设置停止位;若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB */
if(nStop == )
tty_cfg.c_cflag &= ~CSTOPB; /*默认为一位停止位; */
else if( nStop == )
tty_cfg.c_cflag |= CSTOPB; /* CSTOPB表示送两位停止位 */ /* flow control option */
tty_cfg.c_cflag |= CRTSCTS; /* 设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时*/
tty_cfg.c_cc[VTIME] = ; /* 非规范模式读取时的超时时间;*/
tty_cfg.c_cc[VMIN] = ; /* 非规范模式读取时的最小字符数*/
tcflush(fd, TCIFLUSH); /* tcflush清空终端未完成的输入/输出请求及数据;TCIFLUSH表示清空正收到的数据,且不读取出来 */ /*激活配置使其生效*/
if((tcsetattr(fd, TCSANOW, &tty_cfg)) != ) {
printf("com set error");
exit();
} return ;
} void dump_data(char *buf)
{
int i; for(i=; i<TEST_LEN; i++) {
if(i% == )
printf("\n");
printf("0x%x, ", buf[i]);
}
} char buff[TEST_LEN]; int main(int argc, char *argv[])
{
int fd=;
int cnt=;
int sum=;
static int num=;
char *p=NULL; parse_cmd(argc, argv);
printf("RX: dev_name=%s, baud_rate=%d\n", dev_name, baud_rate); fd = open(dev_name,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd < ) {
printf("Can't Open %s\n", dev_name);
return -;
} set_serial(fd, baud_rate, , 'N', );
sleep(); memset(buff, 0x0, TEST_LEN);
//printf("start recv: %ds\n", time(NULL));
p = &buff[];
while() {
cnt = read(fd, p, TEST_LEN);
if(cnt <= ) {
//sleep(1);
continue;
}
sum += cnt;
if(sum >= TEST_LEN)
break;
p += cnt;
printf("RX%d: cnt = %d, sum = %d\n", num++, cnt, sum);
}
printf("recv %d: %ds\n", sum, time(NULL));
p = NULL;
close(fd); //dump_data(buff); return ;
}
UART 串口示例代码的更多相关文章
- Linux下读写UART串口的代码
Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- //////////////// ...
- Arduino - 串口操作函数与示例代码大全
来源:https://blog.csdn.net/iracer/article/details/50334041 Arduino - 串口操作函数与示例代码大全 本文总结了Arduino常用串口操作函 ...
- (三) UART 串口通讯
UART : university asynchronous receiver and transmitter UART // 通用异步接收器和发送器 为什么要有串口:因为许多嵌入式设备没有显示屏 ...
- 【C51】UART串口通信
我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑, 单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...
- uart串口协议
uart串口协议 /* USART Word Length ---------------------------------------------------------*/ US ...
- 第十六章 IIC协议详解+UART串口读写EEPROM
十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...
- linux UART串口驱动开发文档
转:http://www.360doc.com/content/10/0417/18/829197_23519037.shtml linux UART串口驱动开发文档时间:2010-01-09 14: ...
- 基于STM32之UART串口通信协议(四)Printf发送
一.前言 1.简介 前面在UART发送中已经讲解过如何调用HAL库的HAL_UART_Transmit函数来实现串口发送,而在调用这个函数来实现串口发送的话,但是在发送数据或者字符的时候,需要将数据或 ...
- 基于STM32之UART串口通信协议(二)发送
一.前言 1.简介 在上一篇UART详解中,已经有了关于UART的详细介绍了,也有关于如何使用STM32CubeMX来配置UART的操作了,而在该篇博客,主要会讲解一下如何实现UART串口的发送功能. ...
随机推荐
- python初级(302) 6 对象(三)
一.复习 1.什么是魔法方法? 2.什么是类的初始化函数? 二.什么是self 使用一个类可以创建多个对象实例,例如: ball1 = Ball("red", "smal ...
- Spring Boot整合UEditor不修改源码
1.创建Springboot项目,目录结构如下(在resources中static/ueditor/jsp/config.json) 2.pom文件引入 <dependency> < ...
- [ kvm ] 三种基础网络模型创建及分析
1. 前言 最近在模拟生产环境在做测试,本来准备用 vmware 直接来实现的,本着学以致用的道理,选择直接在linux 环境使用 kvm 来模拟测试,遇到的第一个问题就是,网络环境的模拟.这里对比v ...
- Gerrit - 代码评审工具Gerrit简介与安装
1 - 前言 Code Review 代码评审是指在软件开发过程中,对源代码的系统性检查,改进代码质量,查找系统缺陷,保证软件总体质量和提高开发者自身水平. 简单的说,Code Review是用来确认 ...
- perl oneline
可参考博客:http://blog.csdn.net/carzyer/article/details/5117429 Perl常用命令行参数概览 -e 指定字符串以作为脚本(多个字符串迭加)执行 -M ...
- A记录(主机名解析)、CNAME(别名解析)和URL转发(域名转发)
什么是 A记录(主机名解析).CNAME(别名解析)和URL转发(域名转发)? A记录(主机名解析)是最普通的域名解析,是把某一主机名解析到一个IP. 例如www.***.com-> 20.10 ...
- leetcode的Hot100系列--347. 前 K 个高频元素--hash表+直接选择排序
这个看着应该是使用堆排序,但我图了一个简单,所以就简单hash表加选择排序来做了. 使用结构体: typedef struct node { struct node *pNext; int value ...
- 山峰和山谷 Ridges and Valleys
题目描述 思路 一开始看这道题目,也不是很会,谁会把统计之类的问题和bfs联系在一起,没有开始的状态,没有结束的状态,题目中连一个最短之类的词也没有出现. 然后统计嘛,题目中说了方格高度都相同,就把周 ...
- 深度学习-Wasserstein GAN论文理解笔记
GAN存在问题 训练困难,G和D多次尝试没有稳定性,Loss无法知道能否优化,生成样本单一,改进方案靠暴力尝试 WGAN GAN的Loss函数选择不合适,使模型容易面临梯度消失,梯度不稳定,优化目标不 ...
- kibana内存设置
kibana是一个基于NodeJS的单页web应用.而NodeJS则是基于Chrome V8引擎的.V8引擎对于内存的使用是有限制的,默认情况下,64位系统下约为1.4GB,32位系统下约为0.7GB ...