首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux下串口编程(读写)解决方法

2012-02-04 
linux下串口编程(读写)以下是我在linux终端下写的C代码,目的是想让其能接受到串口的数据,可是不知道为什么

linux下串口编程(读写)
以下是我在linux终端下写的C代码,目的是想让其能接受到串口的数据,可是不知道为什么总是不能接受到,也没有报错信息,请大侠们看看,帮帮忙指点以下,谢谢!

#include   <sys/types.h>
#include   <sys/stat.h>
#include   <fcntl.h>
#include   <termios.h>
#include   <stdio.h>


#define   BAUDRATE   B38400                        
#define   MODEMDEVICE   "/dev/ttyS0 "
//#define   _POSIX_SOURCE   1   /*   POSIX   compliant   source   */

#define   FALSE   0
#define   TRUE   1

volatile   int   STOP=FALSE;  

main()
{
    int   fd,c,   res;
    struct   termios   oldtio,newtio;
    char   buf[255];

  fd   =   open(MODEMDEVICE,   O_RDWR   |   O_NOCTTY   );  
  if   (fd   <0)   {perror(MODEMDEVICE);   exit(-1);   }

  tcgetattr(fd,&oldtio);  
  bzero(&newtio,   sizeof(newtio));  


  newtio.c_cflag   =   BAUDRATE   |   CRTSCTS   |   CS8   |   CLOCAL   |   CREAD;
 
  newtio.c_iflag   =   IGNPAR   |   ICRNL;
 

  newtio.c_oflag   =   0;
 
  newtio.c_lflag   =   ICANON;

  newtio.c_cc[VINTR]         =   0;           /*   Ctrl-c   */  
  newtio.c_cc[VQUIT]         =   0;           /*   Ctrl-\   */
  newtio.c_cc[VERASE]       =   0;           /*   del   */
  newtio.c_cc[VKILL]         =   0;           /*   @   */
  newtio.c_cc[VEOF]           =   4;           /*   Ctrl-d   */
  newtio.c_cc[VTIME]         =   0;           /*   inter-character   timer   unused   */
  newtio.c_cc[VMIN]           =   1;           /*   blocking   read   until   1   character   arrives   */
  newtio.c_cc[VSWTC]         =   0;           /*   '\0 '   */
  newtio.c_cc[VSTART]       =   0;           /*   Ctrl-q   */  
  newtio.c_cc[VSTOP]         =   0;           /*   Ctrl-s   */
  newtio.c_cc[VSUSP]         =   0;           /*   Ctrl-z   */
  newtio.c_cc[VEOL]           =   0;           /*   '\0 '   */
  newtio.c_cc[VREPRINT]   =   0;           /*   Ctrl-r   */
  newtio.c_cc[VDISCARD]   =   0;           /*   Ctrl-u   */
  newtio.c_cc[VWERASE]     =   0;           /*   Ctrl-w   */
  newtio.c_cc[VLNEXT]       =   0;           /*   Ctrl-v   */
  newtio.c_cc[VEOL2]         =   0;           /*   '\0 '   */




  tcflush(fd,   TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);


  while   (STOP==FALSE)   {          
        res   =   read(fd,buf,255);  
        buf[res]=0;                          
        printf( ":%s:%d\n ",   buf,   res);
        if   (buf[0]== 'z ')   STOP=TRUE;
  }

  tcsetattr(fd,TCSANOW,&oldtio);
}

[解决办法]
你是不是在虚拟机下调试的??
[解决办法]
打开,设置是否成功都输出点信息来方便调试
[解决办法]
可能是你机器串口的问题吧
[解决办法]
这个程序是你要的。
1 /***************************************************************************
2 * tty_test.c
3 *
4 * Thu May 24 11:22:27 2007
5 * Copyright 2007 User
6 * Email <kf701.ye AT gmail.com>
7 ****************************************************************************/
8
9
10 #include <errno.h>
11 #include <sys/types.h>
12 #include <fcntl.h>
13
14 #include "kf701.h "
15
16 int main(int argc, char **argv)
17 {
18 int nread;
19 char buff[512];
20
21 int fd = open( "/dev/ttyS0 ", O_RDWR ); //| O_NOCTTY | O_NDELAY
22 if (-1 == fd)
23 {
24 perror( "Can 't Open Serial Port ");
25 return -1;
26 }
27
28 set_speed(fd,115200);
29 if (set_parity(fd,8,1, 'N ') == false)
30 {
31 printf( "Set Parity Error\n ");
32 exit (0);
33 }
34 printf( "Set Parity ok\n ");
35
36 while (1)
37 {
38 while((nread = read(fd, buff, 512))> 0)
39 {
40 printf( "\nLen %d\n ",nread);
41 buff[nread - 1] = '\0 ';
42 printf( "%s\n ", buff);
43 }
44 }
45 close(fd);
46 exit (0);
47 }

[解决办法]
串口发送和接收的时候许多设置应该一样,你看发送的串口和接收串口的设置是否相同,还有你可以把你的程序加上数据发送,然后将串口的2和3信号线短接,就可以用一个串口进行收发。
[解决办法]
第三方类有问题

热点排行