|
TQ_guoxixiao 发表于 2012-2-20 12:05
这个程序却需要等个几秒种,肯定是你程序接受的问题,接受慢。
可以贴出来代码,帮你看看。
arm端:
/*
*实现开发板与宿主机的串口通信
*宿主机实现写,开发板读
*步骤:
1.打开串口
2.设置串口参数
3.读写串口(包括宿主机和开发板)
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include "open_port_arm9.c"
#include "../set_opt.c"
#include "pthread.h"
#define BUFFER_SIZE 30 /*最大缓冲区*/
#define TARGET_COM_PROT 1 /*用n表示目标机上的串口n*/
int main(int argc,char* argv[]){
//打开串口设备
int fd;
char buff[BUFFER_SIZE];
if(fd = open_port(TARGET_COM_PROT) < 0){
perror("open_port");
return -1;
}
if(set_opt(fd,115200,8,'N',1) < 0){
perror("set_port_config");
return -1;
}
/*
do{
memset(buff,0,BUFFER_SIZE);
sleep(1);
int ret = 0;
if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
printf("The recevied words are %d,and str = %s\n",ret,buff);
}
}while(strncmp(buff,"quit",4));
*/
printf("welcome to tq2440\n");
while(1){
int ret = 0;
if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
buff[ret] = '\0';
printf("\nrecv:%d\n",ret);
printf("%s",buff);
printf("\n");
}else{
printf("no data\n");
}
}
close(fd);
return 0;
}
pc端:
/*
*实现开发板与宿主机的串口通信
*宿主机实现写,开发板读
*步骤:
1.打开串口
2.设置串口参数
3.读写串口(包括宿主机和开发板)
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include "open_port.c"
#include "../set_opt.c"
#define HOST_COM_PORT 1 /*表示PC的串口1*/
#define BUFFER_SIZE 30 /*最大缓存大小*/
/*
* 写数据到开发板
*/
int main(int argc,char* argv[]){
int fd;
char buff[BUFFER_SIZE];
if(fd = open_port(HOST_COM_PORT) < 0){
perror("open_port");
return -1;
}
if(set_opt(fd,115200,8,'N',1) < 0){
perror("set_port_config");
return -1;
}
do{
/*
printf("Input some words(enter 'quit' to exit):");
memset(buff,0,BUFFER_SIZE);
if(fgets(buff,BUFFER_SIZE,stdin) == NULL){
perror("fgets");
break;
}
*/
int ret;
if((ret = read(fd,buff,BUFFER_SIZE)) > 0){
buff[ret] = '\0';
printf("\n%d\n",ret);
printf("%s",buff);
printf("\n");
}
//write(fd,buff,strlen(buff));
}while(strncmp(buff,"quit",4));
close(fd);
return 0;
}
参数设置函数:
/*
*设置串口参数
*
*/
int set_port_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits){
struct termios new_cfg,old_cfg;
int speed;
//1.保存原先串口配置
if(tcgetattr(fd,&old_cfg) != 0){
perror("tcgetayttr");
return -1;
}
new_cfg = old_cfg;
//2.激活选项
cfmakeraw(&new_cfg);
//3.设置字符大小
new_cfg.c_cflag &= ~CSIZE;
//4.设置波特率
switch(baud_rate){
case 2400:
speed = B2400;
break;
case 4800:
speed = B4800;
break;
case 9600:
speed = B9600;
break;
case 19200:
speed = B19200;
break;
case 38400:
speed = B38400;
break;
default:
case 115200:
speed = B115200;
break;
}
tcflush(fd,TCIOFLUSH);
cfsetispeed(&new_cfg,speed);
cfsetospeed(&new_cfg,speed);
tcflush(fd,TCIOFLUSH);
//5.设置数据位
new_cfg.c_cflag |= (CLOCAL | CREAD);
new_cfg.c_cflag &= ~CSIZE;
switch(data_bits){
case 7:
new_cfg.c_cflag |= CS7;
break;
default:
case 8:
new_cfg.c_cflag |= CS8;
break;
}
//6.设置奇偶校验位
switch(parity){
default:
case 'n':
case 'N':
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~INPCK;
break;
case 'o':
case 'O':
new_cfg.c_cflag |= (PARODD | PARENB);
new_cfg.c_cflag |= INPCK;
break;
case 'e':
case 'E':
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_cflag |= INPCK;
break;
case 's':
case 'S':
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_cflag &= ~CSTOPB;
break;
}
//7.设置停止位
switch(stop_bits){
default:
case 1:
new_cfg.c_cflag &= ~CSTOPB;
break;
case 2:
new_cfg.c_cflag |= CSTOPB;
break;
}
if(parity != 'n'){
new_cfg.c_iflag |= INPCK;
}
//8.设置最少字符和等待时间
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 0;
new_cfg.c_iflag |= IGNPAR|ICRNL;
new_cfg.c_oflag |= OPOST;
new_cfg.c_iflag &= ~(IXON|IXOFF|IXANY);
//9.处理未接受的字符
tcflush(fd,TCIFLUSH);
//10.激活新配置
if((tcsetattr(fd,TCSANOW,&new_cfg)) != 0){
perror("tcsetattr");
return -1;
}
tcflush(fd,TCIOFLUSH);
return 0;
}
还有一个打开串口函数就不贴了
|
|