当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 6 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-19 13:08 

注册: 2008-10-28 17:17
帖子: 154
送出感谢: 0 次
接收感谢: 0 次
以前在windows下直接调用api就好了,现在换到linux,不知道该如下手,小白一个,能不能指点一下?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-19 15:26 

注册: 2007-02-21 16:03
帖子: 40
送出感谢: 0 次
接收感谢: 0 次
你如果用java的话,可以试试rxtx。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-19 18:57 

注册: 2007-02-28 11:33
帖子: 415
送出感谢: 0 次
接收感谢: 0 次
lz做什么串口编程嘛,这么基础的问题! 上google一搜,还资料还少吗?
http://www.google.cn/search?q=linux+%E4 ... =firefox-a

[code]
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
[/code]
在 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;      /* local mode flags */   
   unsigned char  c_line;          /* line discipline */   
   unsigned char  c_cc[NCC];    /* control characters */
};


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

波特率设置

下面是修改波特率的代码:
代码:
struct  termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200);     /*设置为19200Bps*/
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);


设置波特率的例子函数:
代码:
/**
*@brief  设置串口通信速率
*@param  fd     类型 int  打开串口的文件句柄
*@param  speed  类型 int  串口速度
*@return  void
*/
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);   
      } 
   }
}

设置效验的函数:
代码:
/**
*@brief   设置串口数据位,停止位和效验位
*@param  fd     类型  int  打开的串口文件句柄
*@param  databits 类型  int 数据位   取值 为 7 或者8
*@param  stopbits 类型  int 停止位   取值为 1 或者2
*@param  parity  类型  int  效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
   struct termios options;
   if  ( tcgetattr( fd,&options)  !=  0) {
      perror("SetupSerial 1");     
      return(FALSE); 
   }
   options.c_cflag &= ~CSIZE;
   switch (databits) /*设置数据位数*/
   {   
   case 7:      
      options.c_cflag |= CS7;
      break;
   case 8:     
      options.c_cflag |= CS8;
      break;   
   default:   
      fprintf(stderr,"Unsupported data size\n"); return (FALSE); 
   }
switch (parity)
{   
   case 'n':
   case 'N':   
      options.c_cflag &= ~PARENB;   /* Clear parity enable */
      options.c_iflag &= ~INPCK;     /* Enable parity checking */
      break; 
   case 'o':   
   case 'O':     
      options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ 
      options.c_iflag |= INPCK;             /* Disnable parity checking */
      break; 
   case 'e': 
   case 'E':   
      options.c_cflag |= PARENB;     /* Enable parity */   
      options.c_cflag &= ~PARODD;   /* 转换为偶效验*/     
      options.c_iflag |= INPCK;       /* Disnable parity checking */
      break;
   case 'S':
   case 's':  /*as no parity*/   
       options.c_cflag &= ~PARENB;
      options.c_cflag &= ~CSTOPB;break; 
   default:   
      fprintf(stderr,"Unsupported parity\n");   
      return (FALSE); 
   } 
/* 设置停止位*/ 
switch (stopbits)
{   
   case 1:   
      options.c_cflag &= ~CSTOPB; 
      break; 
   case 2:   
      options.c_cflag |= CSTOPB; 
      break;
   default:   
       fprintf(stderr,"Unsupported stop bits\n"); 
       return (FALSE);
}
/* Set input parity option */
if (parity != 'n')   
   options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/   
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)   
{
   perror("SetupSerial 3");   
   return (FALSE); 
}
return (TRUE); 
}



页首
 用户资料  
 
4 楼 
 文章标题 : Re: 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-19 20:17 
头像

注册: 2007-03-02 17:36
帖子: 7259
送出感谢: 3
接收感谢: 97
linux的世界里,一切皆是文件。像读写文件一样的读写串口设备(/dev/ttyS0)就好了。 :em11


_________________
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-20 11:27 

注册: 2008-10-28 17:17
帖子: 154
送出感谢: 0 次
接收感谢: 0 次
谢谢各位的详细解答。

我作的是工控开发,以前在windows下用vc,labview开发很方便,现在转到linux下,很多问题不懂。比如,怎么进行多线程的开发(不好意思,我甚至不知道多线程是不是windows的说法),怎么编写界面,等等。

哪里可以找到这些资料阿?放弃现有的习惯和思路,从头开始还是挺困难的


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 请问linux下如何对串口进行编程?
帖子发表于 : 2008-12-20 14:27 
头像

注册: 2007-03-02 17:36
帖子: 7259
送出感谢: 3
接收感谢: 97
多线程有pthread库,推荐个网站
www.chinaunix.net


_________________
虽然世上没有完美的东西,但这并不影响我们追求完美,因为只有偏执狂才TMD能成功。
10.04新手入门——笨兔兔讲述自己的故事


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 6 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译