|
TQ-lkp 发表于 2012-10-30 09:17
只说不行,自己写的程序,代码也不贴,谁能帮你!!!!
ok,不好意思了!现在贴上去。。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include"pthread.h"
struct termios newtio;
static int serial_fd;
//--------------------------------------------------
//串口初始化
//--------------------------------------------------
void serial_open(void)
{
char *Dev;
int i;
//readserialcfg();
//print_serialread();
//Dev = serialread.serial_dev;
//Dev = ;
//打开串口设备
serial_fd = open("/dev/tq2440_serial1", O_RDWR, 0);
if(serial_fd < 0)
{
perror("Can't Open Serial Port");
exit(0);
}
//if(serial_fd > 0)
//set_speed(serial_fd); //设置波特率
else
{
printf("\nserial_fd = %d\n",serial_fd);
}
//恢复串口未阻塞状态
if (fcntl(serial_fd, F_SETFL, O_NONBLOCK) < 0) //fcntl(fd,cmd,long arg),非阻塞,return -1 or return -E******
{
printf("fcntl failed!\n");
exit(0);
}
//检查是否是终端设备
if(isatty(STDIN_FILENO)==0)
{
printf("standard input is not a terminal device\n");
}
else
printf("isatty success!\n");
}
//配置串口
int serial_set(void)
{
struct termios oldtio;
struct termios newtio;
//1、保存原有串口配置
if(tcgetattr(serial_fd, &oldtio) != 0)
{
perror("SetupSerial 1");
//return(FALSE);
return -1;
}
//2、激活本地连接和接受使能
bzero(&newtio, sizeof(newtio)); //使用之前先清空
newtio.c_cflag |= CLOCAL | CREAD;
//3、设置数据位数
newtio.c_cflag &= ~CSIZE; //除去数据位中的位掩码
newtio.c_cflag |= CS8; //设置数据位
//4、设置奇偶校验位:无奇偶校验位
newtio.c_cflag &= ~PARENB; //激活校验位使能标志
//5、设置波特率
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
newtio.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG); //原始输入模式
newtio.c_oflag &= ~OPOST; // 原始输出模式
//newtio.c_oflag &= ~(ONLCR|OCRNL); //屏蔽回车和换行
//newtio.c_iflag &= ~(ICRNL|OCRNL); //
//newtio.c_iflag &= ~(IXON|IXOFF|IXANY); //
//6、设置停止位:1
newtio.c_cflag &= ~CSTOPB;
//7、设置等待时间和最小接收字符
newtio.c_cc[VTIME] = 0; //超时时间 15s
newtio.c_cc[VMIN] = 0; //接收的字符
//8、处理要写入的引用对象
tcflush(serial_fd, TCIFLUSH); //处理未接收字符串,TCIFLUSH:刷新收到的数据但不读
//9、激活新配置
if(tcsetattr(serial_fd, TCSANOW, &newtio) != 0) //TCSANOW:改变的配置立即生效
{
perror("SetupSerial 3");
//return(FALSE);
return -1;
}
return 0;
}
void serial_rw()
{
int i;
char buff[512] ;
char buff2[] = "hello,TQ2440!\n";
int nread,nwrite;
nwrite = write(serial_fd,buff2,sizeof(buff2));
printf("nwrite=%d\n",nwrite);
while(1)
{
if((nread = read(serial_fd,buff,512))>0)
{
buff[nread] = '\0';
#if 0 //调用这段代码可以实现回显,如果配合上面的回显,就会出现回显两次的情况。
write(serial_fd,buff,nread);
#endif
printf("\nrecv:%d\n",nread);
#if 0
for(i=0;i<nread;i++)
{
printf("%c",buff);
}
printf("\n");
#else
printf("%s",buff);
printf("\n");
#endif
}
}
close(serial_fd);
}
int main(int argc, char **argv)
{
char cmd[]="MIN 15305060444;\r";
serial_open();
serial_set();
printf("write:%d\n",write(serial_fd,cmd,sizeof(cmd)));
fd_set readfd ;
FD_ZERO(&readfd);
FD_SET(serial_fd,&rfds);
//print_newtio();
//send data
while(1)
{
int retval = select(serial_fd+1,&readfd,NULL,NULL,NULL) ; //这个select函数是网上查询得到的,不过没用处。。
sleep(2);
printf("read:%d\n",read(serial_fd,cmd,sizeof(cmd)));
}
//recieve data
//serial_rw();
return 0;
}
|
|