[]串口通信 零星笔记
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"。
下面的程序演示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, ...]);