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信号线短接,就可以用一个串口进行收发。
[解决办法]
第三方类有问题