[]串口通信 零星笔记

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

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, ...]);


 

posted on 2022-10-04 01:31  bdy  阅读(33)  评论(0编辑  收藏  举报

导航