📄 chuankou.c
字号:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
//打开串口函数
//fd:为串口描述符
//comport: 串口号
int open_port(int fd,int comport)
{
long vdisable;
if(comport==1) //串口1
{ fd=open("/dev/tty",O_RDWR);
if(-1==fd)
{ perror("Can't Open Serial Port");
return (-1);
}
}
else if(comport==2) //串口2
{ fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd)
{ perror("Can't Open Serial Port");
return (-1);
}
}
//恢复串口为阻塞状态
if(fcntl(fd,F_SETFL,0)<0)
printf("fcntl failed!\n");
else
printf("fcntl =%d\n",fcntl(fd,F_SETFL,0));
//测试是否为终端设备
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return fd;
}
//设置串口波特率参数
//fd:为串口描述符
//nSpeed:每秒传输位数
//nBits:数据位
//nEvent:有无奇偶校验
//nStop:停止位
int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
struct termios newtio,oldtio;
//保存所有现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息
if(tcgetattr(fd,&oldtio)!=0)
{
perror("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;
case 460800:
cfsetispeed(&newtio,B460800);
cfsetospeed(&newtio,B460800);
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)
{
perror("com set error");
return -1;
}
printf("set done!\n");
return 0;
}
int main(void)
{
int fd_tty,i;
int fd;
int ret;
char data[36];
int tmp = 1000;
int v;
char ttydata[11];
//打开串口
if((fd_tty=open_port(fd_tty,1))<0)
{
perror("open_port error");
return -1;
}
//初始化设置串口
if((i=set_opt(fd_tty,115200,8,'N',1))<0)
{
perror("set_opt error");
return -1;
}
fd=open("/dev/adc",O_RDWR);
if(fd==-1)
{
perror("error open\n");
exit(-1);
}
printf("open /dev/adc successfully\n");
while(tmp--){
ret=read(fd,data,4);
if(ret==-1)
{
perror("read error\n");
exit(-1);
}
/* v = (*(int *)data)&0x3ff;
for(i = 9; i >= 0; i--){
ttydata[i] = (char)(v&0x1);
v = v >> 1;
}
ttydata[10] = '\0';
printf("read successfully:%s\n",ttydata);
*/ write(fd_tty,data,4);
sleep(1);
}
close(fd);
close(fd_tty);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -