当前位置:  技术问答>linux和unix

『高分』如何实现串口发送数据同时处理接收数据(C/C++)

    来源: 互联网  发布时间:2016-03-04

    本文导语:  现已完成串口的单工的发送和读取,源代码如下: #include  #include   #include  #include  #include  #include  #include  #include  #include  #include  #include  unsigned char ch_read(int fd); int asy_open(char *Port, int Baud); #define  DataT...

现已完成串口的单工的发送和读取,源代码如下:

#include 
#include  
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 



unsigned char ch_read(int fd);
int asy_open(char *Port, int Baud);

#define  DataTimeout     0
#define  UART_DEBUG

/* Main program */

static void useage()
{
printf("uart test for 2410--------------------n");
printf("brate:115200n");
printf("example:n");
printf("uart3 send--------:  #uarttest -3 -s  n");
printf("uart3 receive------:  #uarttest -3 -r  n");
}







int main(int argc, char **argv)
{
int fd;
char portname[15];
int e;
unsigned char ch;
char buf[20] = "hello world!n";
char rvbuf[100];
char rv_Pos;
int ret;
int i,n,recvbytes,flag;

struct timeval timeout;
   
timeout.tv_sec = 0;
timeout.tv_usec = 0;

if(argc!=3)
{
useage();
return -1;
}
sprintf(portname,"/dev/ttyS%d",argv[1][1]-49);
fd = asy_open(portname,B115200);  
if(argv[2][1]=='s')
{
while(1)
{     
write(fd,buf,strlen(buf));
sleep(1);
}
return 0;
}
printf("read-------------n");
rv_Pos=0;
/*
while(1){
FD_ZERO (&rset);
if (fd >= 0)FD_SET (fd, &rset);

        e = select (fd + 1, &rset, NULL, NULL, &timeout);

        if (e > 0){
                 if (fd >= 0 && FD_ISSET (fd, &rset)){
               FD_CLR(fd, &rset);
//ret = ch_read(fd);
read(fd,&ch,1);
//if(ret > 0)
printf("ch = %xn",ch);
}
}
}
*/
memset(rvbuf,0,100);
while(1)
{
//n=read(fd,&ch,1);
recvbytes=0;
ioctl(fd, FIONREAD, &recvbytes);
//if there are some chars in the input buffer, then receive them.
if(recvbytes>0)
{
flag=1;
while(1)
{
n=read(fd,&ch,1);
if(n0)
{

if((rv_Pos+1)>100)
{
printf("1The input buffer is overflowed!n");
rvbuf[rv_Pos]='';
printf(rvbuf);
printf("n");
rv_Pos=0;
}
else
{
rvbuf[rv_Pos]=ch;
rv_Pos++;
}
}
else
{
//rvbuf[rv_Pos]='';
//printf(rvbuf);
//printf("n");
//rv_Pos=0;
break;
}
}
}
if((recvbytes==0)&&(flag==1))
{
rvbuf[rv_Pos]='';
flag=0;
printf(rvbuf);
printf("n");
rv_Pos=0;
}
}
return 0;
}




/* Char processing */
/*
unsigned char ch_read(int fd)
{
unsigned char ch,temp1,buf[10] = {0};
int ret,i;

ret = read(fd,&ch,1);
if(!ret || ch != 0x55)return 0;
fprintf(stderr,"ch = %xn",ch);

ret = read(fd,&ch,1);
if(!ret || ch != 0x55)return 0;
fprintf(stderr,"ch = %xn",ch);

ret = read(fd,&ch,1);
if(!ret)return 0;
fprintf(stderr,"ch = %xn",ch);

temp1 = ch;
ret = read(fd,&ch,1);
if(!ret)return 0;
fprintf(stderr,"ch = %xn",ch);
if((temp1 + ch) != 0xff)return 0;

// if((ch == 0x22) || (ch == 0x13) || (ch == 0x43) || (ch == 0x23))
return temp1;


}*/


/* Uart open fuction */

int asy_open(char *Port, int Baud)
{
struct termio SerialParameters;
int i, fd;

//We want to open the port in nodelay mode, so we are informed if the
// port cannot be opened. 
if ((fd = open (Port, O_RDWR | O_NDELAY)) == -1) {
#ifdef UART_DEBUG
fprintf (stderr, "asy_open: Cannot open port %sn", Port);
#endif
return -1;
}

// Now change the rest of the parameters - non-canonical input, etc. 
if (ioctl (fd, TCGETA, &SerialParameters) == -1) {
#ifdef UART_DEBUG
fprintf (stderr, "asy_open: Cannot ioctl (get) on port %s. Errno = %dn", Port, errno);
#endif
return -1;
}

SerialParameters.c_cflag = Baud | CS8 | CLOCAL | CREAD | HUPCL;
SerialParameters.c_lflag &= ~ICANON;

SerialParameters.c_lflag = 0;
SerialParameters.c_oflag = 0;
SerialParameters.c_iflag = IGNBRK | IGNPAR;
for (i = 0; i 

    
 
 

您可能感兴趣的文章:

  • 如何用java实现将数据库中的image类型数据导出到文本文件。并导入(高分求救!!)
  • 急救:关于BLOB数据类型---在线等待,高分相送!
  • {高分200分}jsp访问linux上的mysql数据库,取到和插入的数据全是乱码,我是这样设置的???
  • >>>>>>>>>>>>>>>急:高分求struts操作数据库表的例子
  • 高分求救!!!怎样在linux下配置tomcat文件?同时配置sqlServer数据库?
  • 高分求教!!!!如何将数据库的查询结果组合起来?
  • 高分请教:Linux系统数据采集
  • 有关数据库连接两种方式的比较??(高分求解)
  • 如何用java将一个文件以字节流形式保存到sqlserver数据库中(给高分)
  • 高分求助:redhad9下的 linux串口数据收和发
  • *** 高分, 关于数据库中文乱码的问题, 请高手指教, 一定给分。 ****
  • 高分求购:对数据库(oracel)的连接、添加、编辑、等操作的javaBean源程序
  • 请问如何把vfp中的数据转换到sqlserver中,高分,急!!!
  • (高分)急!!!如何在DOS批处理文件中判断一个.TXT文件有没有记录(数据)
  • 高分请教(暂为100分):请问如何用applet调用非本地数据库
  • 高分求解一个关于数据库的问题
  • 高分求救:在Jb中怎么实现数据库的操作!
  • 高分请教:我要从oracle中提取数据,然后再browser中画出来,饼状图或者曲线图,请问如何画?
  • 高分求助linux数据包转发编程问题
  • *** 高分, 关于数据库中文在英文系统下出乱码的问题, 请高手指教, 一定给分。 ****
  • 高分求助:我笔记本没有串口,在linux下要和一个串口设备连,怎么办?
  • 高分问linux串口和windows通信问题
  • 高分求解,unix终端上的串口怎么标示
  • 高分求纯DOS系统下的串口调试工具
  • linux下串口驱动编写和PPP协议的实现高分相送
  • 高分解决LINUX串口通信错误,在线等待
  • 高分请教一个串口驱动模块加载的问题
  • 关于Linux串口的问题,高分求助,急!急!急!
  • !!!Linux下如何实现Modem的点对点拨号串口通信? 高分赠送加衷心感谢.
  • 简单问题高分求救:在Redhat 9.0下怎么判断一个串口到底能不能用呀?
  • 请问如何判断往串口的写操作(write)已经完成???高分请教!!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 谁参加过weblogic的证书考试,是否有经验可供参考?高分高分高高分
  • 哪里有JB6下载啊,高分相送,救命
  • 高分求救!我在uclinux上运行应用程序时出现内存分配错误,不知如何解决,解决者高分!!
  • 哪里去找中文的EJB文章?高分悬赏!
  • 有jsp的upload和download 代码么,高分相报!
  • (高分求助)请问,那里有软件开发的<设计文档>
  • 高分寻求jsp代码(网上调查系统,新闻发布系统)就这点分了
  • 高分求购做饼图、线形图的源吗?
  • 关于linu下的中文输入.(高分:300)
  • 一个简单的问题,高分求助!!!
  • 高分求购jbulider6得注册码,企业版本,个人版本都要
  • Linux远程访问的问题,高分求教:)
  • 请问哪儿有Solaris8的光盘映像文件下载???高分相赠!!!
  • 高分求“Ration Rose”&"JBuilder6.0"&"VisualCafe"
  • VJ的一个问题,高分求助,熟悉VJ得请进!
  • 高分求购:linux和unix命令大全电子文档
  • 求UNIXWARE7.11的原版下载,高分相赠,在线等待!!!
  • 关于java?高分相送!
  • 请问哪里可以下载IP地址段对应城市的信息?高分回报!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3