1. 基本的串口通信程序。先讀取內容,再將內容寫回串口。
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <termios.h>
- #include <errno.h>
- main()
- {
- int fd;
- int i;
- int len;
- int n = 0;
- char read_buf[256];
- char write_buf[256];
- struct termios opt;
- fd = open("/dev/ttyATH0", O_RDWR|O_NOCTTY|O_NDELAY);
- if(fd == -1)
- {
- perror("open serial 0\n");
- exit(0);
- }
- tcgetattr(fd, &opt);
- bzero(&opt, sizeof(opt));
- tcflush(fd, TCIOFLUSH);
- cfsetispeed(&opt, B115200);
- cfsetospeed(&opt, B115200);
- opt.c_cflag &= ~CSIZE;
- opt.c_cflag |= CS8;
- opt.c_cflag &= ~CSTOPB;
- opt.c_cflag &= ~PARENB;
- opt.c_cflag &= ~CRTSCTS;
- opt.c_cflag |= (CLOCAL | CREAD);
- opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
- opt.c_oflag &= ~OPOST;
- opt.c_cc[VTIME] = 0;
- opt.c_cc[VMIN] = 0;
- tcflush(fd, TCIOFLUSH);
- printf("configure complete\n");
- if(tcsetattr(fd, TCSANOW, &opt) != 0)
- {
- perror("serial error");
- return -1;
- }
- printf("start send and receive data\n");
- while(1)
- {
- n = 0;
- len = 0;
- bzero(read_buf, sizeof(read_buf));
- bzero(write_buf, sizeof(write_buf));
- while( (n = read(fd, read_buf, sizeof(read_buf))) > 0 )
- {
- for(i = len; i < (len + n); i++)
- {
- write_buf[i] = read_buf[i - len];
- }
- len += n;
- }
- write_buf[len] = '\0';
- printf("Len %d \n", len);
- printf("%s \n", write_buf);
- n = write(fd, write_buf, len);
- printf("write %d chars\n",n);
- sleep(2);
- }
- }
2. 注意
- opt.c_cc[VTIME] = 0;
- opt.c_cc[VMIN] = 0;
在這兩個值均爲0 的情況下,read不管有沒有數據都會立即返回。詳細情況在linux下man tcsetattr.
如果不設定這兩個值,那麼read只有收到回車後纔會讀取緩存中的數據。
異常處理:
如果串口被系統佔用,只能SSH,必須如下操作
一、修改 /etc/inittab
####ttyS0::askfirst:/bin/ash --login
####ttyS1::askfirst:/bin/ash --login
把最下面的兩行註釋掉即可
二、
釋放ttyS0作爲通信串口
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
void CloseConsole(void) {
int fp;
struct termios options;
printf("change1\n");
fp = open("/dev/tty1",O_RDONLY); // 改變console
ioctl(fp,TIOCCONS);
close(fp);
fp = open("/dev/tts/0",O_RDWR|O_NOCTTY|O_NDELAY); //打開串口0讀寫
if(fp == -1) exit(0);
tcgetattr(fp,&options);
cfsetispeed(&options,B115200);
cfsetospeed(&options,B115200);
options.c_cflag |= (CLOCAL|CREAD);
tcsetattr(fp,TCSANOW,&options);
write(fp,"hello world!\n123",15);
close(fp); //關閉串口0
fp = open("/dev/tty0",O_RDONLY); //恢復console 到串口0
ioctl(fp,TIOCCONS);
close(fp);
printf("change2\n");
}
關於關閉SHELL對串口的佔用,使之能做普通的串口通信和撥號
1、步驟:
在內核編譯過程中執行make menuconfig
Character devices --->
Serial drivers --->
S3C2410 serial port support
[ ] Console on S3C2410 serial port 【注】去掉這項即可,不必修改busybox/init.c了
< > 8250/16550 and compatible serial support (EXPERIMENTAL)
2、備註:
這樣就不能用ttyS0口來登錄ARM開發板了,你可以選擇用TELNET的方式來登錄。
做法:telnet 192.168.0.12(你的開發板的IP地址)
輸入:“root”用戶名就可以進入你的開發板了
3、OK..
http://blog.csdn.net/neiloid/article/details/7585876