天嵌 ARM开发社区

 找回密码
 注册
查看: 3510|回复: 11

qtopia开发串口调试助手问题求助!!“亚瑟王,今夜你会不会来?”

[复制链接]
wanggewhut 发表于 2010-2-6 11:36:35 | 显示全部楼层 |阅读模式
标题有点不和谐,希望别被封ID(谁让亚瑟王老是22点以后回帖呢。。。)

我用qtopia仿照first的例子写了一个串口调试助手(想在板子上用)。但是发现打不开串口文件/dev/tq2440_serial1(即串口2,我已经用扩展板把串口2连线引出来了,用”getty /dev/tq2440_serial1 115200“试过串口2可以作为终端使用)。我的qtopia的代码中 用到的打开串口的程序是我以前在其他开发板上调试成功过的,但是就是打不开串口文件。

于是我用论坛上给的测试串口的COM_Test.tar.bz2中的COM_RD_Test.c单独交叉编译,
下面是COM_Test.tar.bz2中的COM_RD_Test.c的相关代码段
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR | O_NONBLOCK, 0 );         //| O_NOCTTY | O_NDELAY
if (-1==fd)        //the return of open() is "fd"
{
  perror("Can't Open Serial Port");
  return -1;
}
else
  return fd;
}


int main(int argc, char **argv)
{
int fd;
int nread;
char buff[512];
char *dev ="/dev/tq2440_serial1";

fd = OpenDev(dev);

printf("TestBEGIN\n");

if (fd>0)
      set_speed(fd,19200);
else
{
  printf("Can't Open Serial Port!\n");
  exit(0);
}
   if (set_Parity(fd,8,1,'N')== FALSE)
   {
      printf("Set Parity Error\n");
      exit(1);
   }

   while(1)
   {
     while((nread = read(fd,buff,512))>0)
     {  
         buff[nread+1]='\0';
      }
   }
     //close(fd);
     //exit(0);
}

运行时也打不开串口文件,打印信息如下:
[root@EmbedSky /bin]# chmod +x COM_RD_Test                                      
[root@EmbedSky /bin]# ./COM_RD_Test                                             
Can't Open Serial Port: Success                                                
TestBEGIN     //这行打印表明已调用 OpenDev函数open过串口/dev/tq2440_serial1 了                                                        
Can't Open Serial Port! //但这里表示获得的串口文件描述符fd是负值,就是还是没打开啊?!

请问
1)串口1的文件是对应的“/dev/tq2440_serial1”吗?在程序中能直接这样用吗?
2)用open( “/dev/tq2440_serial1”, O_RDWR | O_NONBLOCK, 0 )函数能够打开串口吗,还是要用fopen才行?
3)如果用fopen才行的话,《Qt程序开发完全手册》113页中的例子中的 "fopen("/etc/tq2440_serial.cfg","r")"能否改成fopen(“/dev/tq2440_serial1","r"),即不是读取“tq2440_serial.cfg”这个配置表,而是直接打开串口文件?

下面是Qt程序开发完全手册》113页的代码段
void readserialcfg()
{
FILE *serial_fp;
char j[10];
printf("readserailcfg\n");
serial_fp = fopen("/etc/tq2440_serial.cfg","r");
if(NULL == serial_fp)
{
printf("can't open /etc/tq2440_serial.cfg");
}


#tq2440_serial.cfg 文件的内容
SPEED=9600
DATABITS=8
STOPBITS=1
PARITY=N
 楼主| wanggewhut 发表于 2010-2-6 11:40:40 | 显示全部楼层
本帖最后由 wanggewhut 于 2010-2-6 11:53 编辑

自己顶一个先,另外,我的开发环境是fedora10+EABI-4.3.3_EmbedSky_20091210的编译器,
nfs系统用的是root_qtopia_2.2.0_2.6.30.4_20091216,反正就是光盘里带的软件。由于COM_RD_Test.c是没有界面的,所以没用source setARM_QpeEnv设置环境变量,这应该没影响吧??!
亚瑟王 发表于 2010-2-6 16:53:50 | 显示全部楼层
1、单独运行控制台的串口程序,能不能运行呢?如果能运行,请检查打开设备时的返回值是多少。
2、你可以直接调用控制台的串口程序进行测试。
 楼主| wanggewhut 发表于 2010-2-6 23:46:50 | 显示全部楼层
什么是“控制台的串口程序”啊?是否就是串口0啊?(当kernel内核起来以后默认的控制/打印终端,比如串口0,就是所说的“控制台”吧?!)

如果如上所述的话,那我用“ getty /dev/tq2440_serial1 115200”试过,是可以把控制台交给连线扩展出来的串口1(tq2440_serial1 )的,换句话说,已经是确认过硬件上是没问题的,而且getty /dev/tq2440_serial1 115200时也用到了“/dev/tq2440_serial1 ”,似乎说明串口1的文件tq2440_serial1 也是可用的,但就是在程序里read不到。

至于如何在串口控制台中,用什么命令来“检查打开设备时的返回值”我确实不知道啊(只晓得在程序里可以printf串口文件的文件描述符fd可以查看),请版主明示。
亚瑟王 发表于 2010-2-10 15:17:05 | 显示全部楼层
开发板的控制台程序是指的在开发板的串口0(默认是串口0)输入xxxx,然后运行的程序。你说打不开设备有两个可能,根本不存在tq2440_serial1或者open()函数返回的值不对导致的。你需要把open()函数的返回值打印出来才知道。
 楼主| wanggewhut 发表于 2010-2-24 09:41:33 | 显示全部楼层
亚瑟王,我把程序简化了一下,没有用if()语句,而是直接对串口的数据结构进行设置,而且,串口文件的返回值fd_2=3,所以我在open()之前,加了一个close(0),这样fd_2返回0值了。具体代码如下:
int fd_2;
int nread;
char buff[512];

close(0);///////////////////////////////////////////////////////////////

struct termios options_2;
int fd_2= open( "/dev/tq2440_serial1", O_RDWR | O_NONBLOCK, 0 );
if(fd_2!= 0)
{
        perror("can't open the serial port2");
         return -1;
}
else
  return fd_2;

tcflush(fd_2,TCIOFLUSH);

tcgetattr( fd_2,&options_2);
bzero(&options_2,sizeof(options_2));
  
options_2.c_cflag &= ~CSIZE;

options_2.c_cflag |= CS8;
options_2.c_cflag &= ~PARENB;
options_2.c_iflag &= ~INPCK;
options_2.c_cflag &= ~CSTOPB;

options_2.c_lflag&=~(ICANON|ECHO|ISIG);
options_2.c_oflag&=~OPOST;  
options_2.c_iflag&=~(IXON|IXOFF|IXANY);

options_2.c_cc[VTIME]=0;
options_2.c_cc[VMIN]=1;
tcflush(fd_2, TCIOFLUSH);
cfsetispeed(&options_2, B115200);
cfsetospeed(&options_2, B115200);
tcsetattr(fd_2, TCSANOW,&options_2);
tcflush(fd_2,TCIOFLUSH);

printf("start send data...\n");
while(1)
   {
     while((nread = read(fd_2,buff,512))>0)
     {
         printf("\nLen %d",nread);
         buff[nread+1]='\0';
         printf("\n%s\n",buff);
   
      }
   }

但是编译后,在控制台运行以上程序,仍然不能read到板子的串口2(tq2440_serial1)的数据,程序
停在while循环处(终端有打印printf("start send data...\n");),我怀疑串口的设置有问题,但是好像
和COM_RD_Test中调用设置函数来完成的工作没有区别啊??!

请管理员给点意见啊!!!!
 楼主| wanggewhut 发表于 2010-2-24 22:58:31 | 显示全部楼层
顶贴,不要沉啊
 楼主| wanggewhut 发表于 2010-2-28 22:06:49 | 显示全部楼层
元宵节好啊,今晚论坛好安静啊!!
 楼主| wanggewhut 发表于 2010-2-28 22:08:27 | 显示全部楼层
管理员啊,为什么啊?难道我的问题不带有普遍性么??!
亚瑟王 发表于 2010-3-1 11:10:43 | 显示全部楼层
把你的整个程序打包贴上来吧。
 楼主| wanggewhut 发表于 2010-3-13 22:17:53 | 显示全部楼层
节个帖子吧,原来TQ自带的串口线是直连的。。。真是杯洗具啊
亚瑟王 发表于 2010-3-15 11:56:02 | 显示全部楼层
晕死,你没有使用天嵌科技提供的串口线?
对了,能不能把你写的串口程序放到论坛上啊,重新开个帖子吧。谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-5-17 16:25 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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