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

[]串口通信 零星笔记

原文地址: 串口通信 零星笔记 作者: 半岛鱼

1、

打开串口

在 Linux 下串口文件是位于 /dev 下的

串口一 为 /dev/ttyS0

串口二 为 /dev/ttyS1

打开串口是通过使用标准的文件打开函数操作:

打开串口是通过使用标准的文件打开函数操作:

int fd;

fd = open( "/dev/ttyS0", O_RDWR);
if (-1 == fd){ 
 
perror(" 提示错误!");
}

设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。

串口的设置主要是设置 struct termios 结构体的各成员值。

struct termio
{       unsigned short  c_iflag;                
        unsigned short  c_oflag;                        
        unsigned short  c_cflag;                        
        unsigned short  c_lflag;                        
        unsigned char  c_line;                  
        unsigned char  c_cc[NCC];    
};

设置这个结构体很复杂,我这里就只说说常见的一些设置:

波特率设置

下面是修改波特率的代码:

struct  termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200);     
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);

设置波特率的例子函数:

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
          B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,  
          19200,  9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed){
  int   i; 
  int   status; 
  struct termios   Opt;
  tcgetattr(fd, &Opt); 
  for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) { 
    if  (speed == name_arr[i]) {     
      tcflush(fd, TCIOFLUSH);     
      cfsetispeed(&Opt, speed_arr[i]);  
      cfsetospeed(&Opt, speed_arr[i]);   
      status = tcsetattr(fd1, TCSANOW, &Opt);  
      if  (status != 0) {        
        perror("tcsetattr fd1");  
        return;     
      }    
      tcflush(fd,TCIOFLUSH);   
    }  
  }
}

 更多看原文:http://www.ibm.com/developerworks/cn/linux/l-serials/

char *专门用于指以' '为结束的字符串

Main函数参数argc,argv说明

Wikipedia,自由的百科全书

C/C++语言中的main函数,经常带有参数argc,argv,如下:

int main(int argc, char** argv)
 
    
int main(int argc, char* argv[])
 
    

这两个参数的作用是什么呢?argc 是指命令行输入参数的个数,argv存储了所有的命令行参数。假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令行下用 cd 命令进入到 hello.exe 文件所在目录) 运行命令为:

hello.exe Shiqi Yu
 
    

那么,argc的值是 3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。

Image:Hello-argc-argv.png

下面的程序演示argc和argv的使用:

#include <stdio.h>

int main(int argc, char ** argv)
{
    int i;
    for (i=0; i < argc; i++)
        printf("Argument %d is %s.n", i, argv[i]);

    return 0;
}
 
    

假如上述代码编译为hello.exe,那么运行

hello.exe a b c d e
 
    

将得到

Argument 0 is hello.exe.
Argument 1 is a.
Argument 2 is b.
Argument 3 is c.
Argument 4 is d.
Argument 5 is e.
 
    

运行

hello.exe lena.jpg
 
    

将得到

Argument 0 is hello.exe.
Argument 1 is lena.jpg.
 
    

FILE *fopen(const char *filename, const char *mode);

fopen函数说明:将文件 filename以mode方式打开,并返回指向这个文件的一个流.
其中打开方式可以为以下的值:r 只读方式打开w 创建一个文件用于写入,如果文件已经存在,这个文件会被覆写a 打开一个文件并添加,如果文件存在,打开的时候是指向文件的最后,如果不存在则创建r+ 打开一个已经存在的文件来更新(读写),不存在则创建w+ 创建一个文件来更新(读写),如果文件已经存在,则会被覆写a+ 打开一个文件来更新,如果文件存在,打开的时候是指向文件的最后,如果不存在则创建
另外还可以指定是以二进制方式(b)打开还是以文本方式(t)打开
所以fp=fopen(filename, "rb++"); 应该是以二进制方式打开filename来更新另外,与fopen一起用的还有:
指定当前位置:
        int fseek(FILE *stream, long offset, int origin);
       void rewind(FILE *stream);//指到开始位置
读:size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
写:size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
格式化:int fprintf(FILE *stream, const char *format[, argument, ...]);


 
   

相关文章:

  • []C/C++读取串口接收到的数据程序
  • []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  的含义
  • 收藏网友的 源程序下载网
  • If…else
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Js基础知识(一) - 变量
  • LeetCode18.四数之和 JavaScript
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-redux的原理以及使用
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • SwizzleMethod 黑魔法
  • Yii源码解读-服务定位器(Service Locator)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 汉诺塔算法
  • 详解移动APP与web APP的区别
  • 以太坊客户端Geth命令参数详解
  • 在Docker Swarm上部署Apache Storm:第1部分
  • kubernetes资源对象--ingress
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (C语言)fread与fwrite详解
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (一)SpringBoot3---尚硅谷总结
  • .form文件_一篇文章学会文件上传
  • .gitignore文件设置了忽略但不生效
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 程序发生了一个不可捕获的异常
  • .NET 发展历程
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET连接MongoDB数据库实例教程
  • @Autowired @Resource @Qualifier的区别
  • @Autowired和@Resource装配
  • @ComponentScan比较