http://hi.baidu.com/%CD%FE%B5%C4%C9%FA%BB%EE/blog/item/0110068308c5fb9cf603a6be.html
之前要做一个和串口相关的项目,才认真研究了下串口,首先就是要实现串口和PC机的通信。
串口的驱动一般不需要我们写,都是很成熟的驱动,要知道的一点就是你开发板串口的名称,比如ttySAC0,等。所以主要的工作就是编程序,实现串口的收发,这当然也好理解,就把串口当成文件,对其进行读写就可以了。
首先说明下我的编译环境,Linux使用的版本是2.6.30.4,交叉编译器使用的是EABI4.3.3。下面是程序代码,只有一个文件:serialport.c!
/**************serialport**************************/
/*************Designed by Suo*********************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
//serial port set function
void setTermios(struct termios *pNewtio, unsigned short uBaudRate)
{
bzero(pNewtio,sizeof(struct termios));
pNewtio->c_cflag = uBaudRate|CS8|CREAD|CLOCAL;
pNewtio->c_iflag = IGNPAR;
pNewtio->c_oflag = 0;
pNewtio->c_lflag = 0;
pNewtio->c_cc[VINTR] = 0;
pNewtio->c_cc[VQUIT] = 0;
pNewtio->c_cc[VERASE] = 0;
pNewtio->c_cc[VKILL] = 0;
pNewtio->c_cc[VEOF] = 4;
pNewtio->c_cc[VTIME] = 5;
pNewtio->c_cc[VMIN] = 0;
pNewtio->c_cc[VSWTC] = 0;
pNewtio->c_cc[VSTART] = 0;
pNewtio->c_cc[VSTOP] = 0;
pNewtio->c_cc[VSUSP] = 0;
pNewtio->c_cc[VEOL] = 0;
pNewtio->c_cc[VREPRINT] = 0;
pNewtio->c_cc[VDISCARD] = 0;
pNewtio->c_cc[VWERASE] = 0;
pNewtio->c_cc[VLNEXT] = 0;
pNewtio->c_cc[VEOL2] = 0;
}
int main(int argc,char **argv)
{
int fd;
int nCount,nTotal;
int i,j,m;
int ReadByte = 0;
struct termios oldtio,newtio;
char *dev = "/dev/tq2440_serial1";
if((argc!=3)||(sscanf(argv[1],"%d",&nTotal)!=1))
{
printf("Usage:COMSend count datat!/n");
return -1;
}
if((fd=open(dev,O_RDWR|O_NOCTTY|O_NDELAY))<0) //open serial COM2
{
printf("Can't open serial port!/n");
return -1;
}
tcgetattr(fd,&oldtio);
setTermios(&newtio,B9600);
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
//Send data
for(i=0;i
{
nCount = write(fd,argv[2],strlen(argv[2]));
printf("send data OK!count=%d/n",nCount);
sleep(1);
}
//receive data
for(j=0;j<20;j++)
{
ReadByte = read(fd,Buffer,512);
if(ReadByte>0)
{
printf("readlength=%d/n",ReadByte);
Buffer[ReadByte]='/0';
printf("%s/n",Buffer);
sleep(3);
}
else printf("Read data failure times=%d/n",j);
}
printf("Receive data finished!/n");
tcsetattr(fd,TCSANOW,&oldtio);
close(fd);
return 0;
}
此程序实现的功能是:运行程序时,输入要发送的次数及待发送数据,就向串口2发送数据,如果有数据过了,程序会把接收到的数据显示在终端上。
相应的Makefile是:
CROSS=arm-linux-
all:shuserial
shuserial:shuserial.c
$(CROSS)gcc -o shuserial shuserial.c
$(CROSS)strip shuserial
clean:
@rm -vf shuserial*.o*~
make出可执行文件serialport后,就可以在开发板上调试了。调试方法:1、把程序用U盘拷到开发板中(当然前提是已启动Linux系统),我的开发板是Linux2.6.30内核+Qtopia2.2.0。2、连接串口,用串口线把开发板串口2和电脑相连,PC打开超级终端,设置串口COM1属性为9600波特率,8N1,然后等待接收。3、打开开发板系统中的终端Terminal,输入./serialport 10 abcdefghijk ,即可运行此程序,程序向PC串口发送发送10次“abcdefghijk”,发送完成后,如果你向超级终端输入了数据,程序会把数据显示到Terminal上。
完成了,程序就是这么简单,只是实现了简单的收发功能。
以后用Qt实现此程序……