天嵌 ARM开发社区

 找回密码
 注册
查看: 2811|回复: 7

串口通信怎么会读不回来?

[复制链接]
请叫我不良 发表于 2012-10-29 22:33:02 | 显示全部楼层 |阅读模式
写了个串口通信程序,数据可以发送,却read不回来。。网上有很多这种问题,可是没完善的说法,拜求大神指教!!
 楼主| 请叫我不良 发表于 2012-10-29 22:38:11 | 显示全部楼层
这是终端上显示的信息。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 请叫我不良 发表于 2012-10-29 22:39:11 | 显示全部楼层
传错了,不好意思了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2012-10-30 09:17:33 | 显示全部楼层
只说不行,自己写的程序,代码也不贴,谁能帮你!!!!
 楼主| 请叫我不良 发表于 2012-10-30 09:44:54 | 显示全部楼层
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;
}
 楼主| 请叫我不良 发表于 2012-10-30 09:46:23 | 显示全部楼层
请叫我不良 发表于 2012-10-30 09:44
ok,不好意思了!现在贴上去。。

#include

void serial_rw()这个函数没用到。。。
TQ-lkp 发表于 2012-10-31 15:35:31 | 显示全部楼层
你短路2,3脚没有?
 楼主| 请叫我不良 发表于 2012-11-1 09:10:22 | 显示全部楼层
TQ-lkp 发表于 2012-10-31 15:35
你短路2,3脚没有?

所谓的2,3脚是??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-9 01:54 , Processed in 1.046888 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表