|
MTK7688 openwrt串口程序C编程
在上一篇中我主要通过命令测试了下MTK7688的串口1通信功能见( https://bbs.eeworld.com.cn/thread-619370-1-1.html) ,后面花了一些时间去了解了下linux下的C编程,参加工作后有6年没用过Linux编程了, 大学学的东西基本也还给老师了,幸好我这人比较喜欢书,大学的书都拖到北京了,没卖掉,拿上大学的linux设备驱动开发编程书籍晚上睡前看下也比较快熟悉了,linux的核心思想就是一切皆文件,宝哥写的。其实linux如果是拿来做应用开发,不怎么去熟悉个中实现原理,还是能很快熟悉了,尤其是强大的网络组件,用上后,都不想回来在非linux环境下做开发了,傻瓜似编程,我们实现串口通信也主要是对ttyS1文件操作,代码如下,主要是实现了PC串口调试助手软件发送数据给MTK7688板子,板子再回传给PC串口调试助手软件。
#include
#include
#include
#include
#include
#include
#include
static int open_uart(void)
{
long vdisable;
int fd;
fd = open("/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);//注意你的设备名
if (-1 == fd)
{
perror("Can't Open Serial Port");
return(-1);
}
return fd;
}
static int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio, oldtio;
if ( tcgetattr( fd,&oldtio) != 0)
{
printf("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if ( nStop == 1 )
{
newtio.c_cflag &= ~CSTOPB;
}
else if ( nStop == 2 )
{
newtio.c_cflag |= CSTOPB;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if ((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
printf("com set error");
return -1;
}
return 0;
}
int main(void)
{
int fd;
fd = open_uart();
char buffer[256]={0};
set_opt(fd,115200,8,'N',1);
while(1)
{
memset(buffer,0,256);
while (read(fd,buffer,sizeof(buffer)) == 0);
write(fd,buffer,strlen(buffer));
}
close(fd);
return 0;
}
在gcc编译下,将生成的二进制文件通过SCP软件传到MTK7688板子上,运行运行如下:
此内容由EEWORLD论坛网友wateras1原创,如需转载或用于商业用途需征得作者同意并注明出处
|
|