OPENWRT的串口初试

        近来因为项目需要,第一次接触Linux系统的硬件,心里有点小激动。。。我使用的Microwrt是OPENWRT的微型版本,系统一样,但更加小巧,方便使用。

OPENWRT的串口初试_第1张图片

        不过由于是第一次使用,光Helloworld就测试了很长时间。现在更卡在了串口问题上,在网上也没找到OPENWRT串口方面的资料(可能是我比较笨吧)。在高人的指导下,我更改了询问度娘的方式,开始搜索Linux串口方面的资料。虽然找到了一些,但是感觉讲解的都不是很清晰。后来找到了shanzhizhi的博客,上面讲解的很清晰,在他的指导下,我也就写了这个简单的串口程序,因为很简单,而且是初试,不足之处,请大家见谅。


Microwrt串口使用过程:

1、通过ssh的方式进入Microwrt系统之中,然后进入/etc/目录,修改inittab,打开文件并将如下代码的最后一行注释掉。

::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K stop
ttyS0::askfirst:/bin/login
#ttyS1::askfirst:/bin/login
2.编辑serial.c文件,代码如下:
/*
 *按照教程学习串口的编程
 *网址:http://blog.csdn.net/shanzhizi/article/details/9241393
 */
//头文件
#include  	//标准输入输出定义
#include 	//标准函数库定义
#include 	//Unix标准函数定义
#include 
#include 
#include  	//文件控制定义
#include 	//POSIX中断控制定义
#include 	//错误号定义
 
 
//定义波特率数组
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300};
 
//打开串口
int open_port(void)
{
	int fd;		//串口的标识符
	//O_NOCTTY用来告诉Linux这个程序不会成为“控制终端”
	//O_NDELAY用来告诉Linux这个程序不关心DCD信号
	fd=open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY);
	if(fd == -1)
	{
		//不能打开串口
		perror("open_port: Unable to open /dev/ttyS1 -");
		return(fd);
	}
	else
	{
		fcntl(fd, F_SETFL, 0);
		printf("open ttys1 .....\n");
		return(fd);
	}
}
 
//设置波特率
void set_speed_and_parity(int fd, int speed)
{
	int i=0;		//设置循环标志——注意不要在for内设置,否则会出错
	struct termios Opt;	//定义termios结构
	if(tcgetattr(fd,&Opt)!=0)
	{
		perror("tcgetattr fd");
		return;
	}
	for(i = 0; i < 8 ; i++)
    	{
        	if(speed == name_arr[i])
        	{	
            		tcflush(fd, TCIOFLUSH);
            		cfsetispeed(&Opt, speed_arr[i]);
            		cfsetospeed(&Opt, speed_arr[i]);
			/*tcsetattr函数标志:
			TCSANOW:立即执行而不等待数据发送或者接受完成。
			TCSADRAIN:等待所有数据传递完成后执行。
			TCSAFLUSH:Flush input and output buffers and make the change
			*/
            		if(tcsetattr(fd, TCSANOW, &Opt) != 0)
            		{	
                		perror("tcsetattr fd");
                		return;
            		}
            		tcflush(fd, TCIOFLUSH);
        	}
    	}
	//设置奇偶校验——默认8个数据位、没有校验位
        Opt.c_cflag &= ~PARENB;
        Opt.c_cflag &= ~CSTOPB;
        Opt.c_cflag &= ~CSIZE;
        Opt.c_cflag |= CS8;
}
 
/*
//设置奇偶校验——默认8个数据位、没有校验位
int set_parity()
{
	Opt.c_options.c_cflag &= ~PARENB
	options.c_cflag &= ~CSTOPB
	options.c_cflag &= ~CSIZE;
	Opt.c_cflag |= CS8;
}
*/
 
int main(void)
{
	int fd;
	int nread,i;
	char buff[]="Hello\n";
	//打开串口
	if((fd=open_port())<0)
    	{
        	perror("open_port error");
        	return 0;
    	}
	//设置波特率和校验位
	set_speed_and_parity(fd,115200);
	//设置校验位
	//set_parity();
 
	printf("fd=%d\n",fd);
 
	//尝试先写内容
	for(int i=0;i<100;i++)
	{
		nread=write(fd,buff,8);
		//nread=read(fd,buff,8);
		printf("nread=%d,%s\n",nread,buff);
	}
	//关闭串口
	close(fd);
	return 0;
}
3.进行编译。在这里就不详细写它的Makefile和它的Make过程了,可以参照openwrt刷机教程。

4.将生成的bin文件通过winscp(win7)或scp指令(Linux和Mac)的方式发送到Microwrt的/usr/bin目录下

5.直接运行./serial。就可以看到它的运行结果了。。。

关于Microwrt的串口连接,使用UPIN54转UPIN27模块就可以了,然后将FT232模块直接插在它的上面,用数据线连接它和电脑,就可以检测串口数据连接了。

OPENWRT的串口初试_第2张图片

你可能感兴趣的:(嵌入式Linux开发,Linux)