天嵌 ARM开发社区

 找回密码
 注册
查看: 4420|回复: 10

自己写的QT串口程序在TQ2440上运行必须先运行板子自带的串口测试程序

[复制链接]
cqqjj3887 发表于 2013-5-31 08:42:55 | 显示全部楼层 |阅读模式
本帖最后由 cqqjj3887 于 2013-9-17 14:27 编辑

自己写的QT串口程序在TQ2440上运行必须先运行板子自带的串口测试程序,然后QT程序的串口模块才会正常工作,请问这个问题怎么解决,我打开ttySAC1这个串口,配置的波特率为9600.
Jangel 发表于 2013-5-31 08:49:48 | 显示全部楼层
你要贴你的代码出来,拒绝玩猜谜游戏哦
 楼主| cqqjj3887 发表于 2013-5-31 10:06:23 | 显示全部楼层
Jangel 发表于 2013-5-31 08:49
你要贴你的代码出来,拒绝玩猜谜游戏哦

fd = open("/dev/ttySAC1", O_RDWR);
    if(fd!=-1)
      serial_open_flag=1;
    else
    perror("Can not open Serial_Port \n!");
    memset(&opt, 0, sizeof opt);
    tcgetattr(fd, &opt);
    tcflush(fd, TCIOFLUSH);
    cfsetispeed(&opt,B9600);
     cfsetospeed(&opt,B9600);
    status = tcsetattr(fd, TCSANOW, &opt);
    if(status != 0)
    {
            perror("tcsetattr fd1");
    }
    tcflush(fd, TCIOFLUSH);
    tcgetattr(fd, &opt);
    opt.c_cflag &= ~CSIZE;
    opt.c_cflag |=CS8;
    opt.c_cflag &= ~PARENB;
    opt.c_iflag &= ~INPCK;
    opt.c_cflag &= ~CSTOPB;
    opt.c_cc[VTIME] = 30;
    opt.c_cc[VMIN] = 0;
    tcflush(fd, TCIFLUSH);
    if (tcsetattr(fd, TCSANOW, &opt) != 0) {
            perror("SetupSerial 3");
    }
while(1)
{
write(fd,serial_ouput_A1_S1,2);// 串口发送2个字符的数据
read(fd,buff,8);//串口读取8个字节的数据
}//另外的实验板是收到2个字节的数据,则实验板回传8个字节的数据回来
代码是按照板子给的例程自己写的,麻烦版主看下是哪个地方有问题.如果未先用QT文件系统自带的串口程序配置ttySAC1,程序就只能成功运行到发送数据处,读取的时候就一直暂停,而在利用QT文件系统自带的串口测试程序将波特率为9600,点击确定后,再运行我写的串口程序时该Qt程序能正常工作,请问这个问题该怎么解决?
TQ-lkp 发表于 2013-5-31 10:23:26 | 显示全部楼层
目测是读太快了,还没回复就读了,你在读之前加些休眠
 楼主| cqqjj3887 发表于 2013-5-31 10:59:16 | 显示全部楼层
TQ-lkp 发表于 2013-5-31 10:23
目测是读太快了,还没回复就读了,你在读之前加些休眠

恩,我设置了读数据等待3秒,没回读数据函数read()语句自动结束,还有就是在运行TQ2440的QT文件系统自带的程序以后读取就没有问题,这个也是和读太快有关系吗?
 楼主| cqqjj3887 发表于 2013-5-31 10:59:57 | 显示全部楼层
本帖最后由 cqqjj3887 于 2013-5-31 11:00 编辑
TQ-lkp 发表于 2013-5-31 10:23
目测是读太快了,还没回复就读了,你在读之前加些休眠

恩,我设置了读数据等待3秒,没回读数据函数read()语句自动结束,还有就是在运行TQ2440的QT文件系统自带的串口测试程序以后读取就没有问题,这个也是和读太快有关系吗?
 楼主| cqqjj3887 发表于 2013-5-31 11:12:56 | 显示全部楼层
TQ-lkp 发表于 2013-5-31 10:23
目测是读太快了,还没回复就读了,你在读之前加些休眠

版主你好,刚已经在程序里添加了usleep()函数,试过了,在没有打开自带的串口测试时,仍然只能运行到write函数那,就不再运行了,打开串口测试程序后程序正常运行,版主还知道其它哪个地方可能出错了吗?
TQ-lkp 发表于 2013-5-31 16:14:11 | 显示全部楼层
这个就看不懂了,你换个串口试试,打开调试的串口
 楼主| cqqjj3887 发表于 2013-6-1 09:23:42 | 显示全部楼层
本帖最后由 cqqjj3887 于 2013-6-1 09:29 编辑
TQ-lkp 发表于 2013-5-31 16:14
这个就看不懂了,你换个串口试试,打开调试的串口

换ttySAC2试过了,还是不行,请问版主TQ2440文件系统的串口测试程序也是用我这种方式对串口进行操作的,还是是用QExtSerialPort对串口进行操作的或者如论坛给出的TQ6410的串口例程使用的"src/armapi/posix_qextserialport.h"封装好的函数对串口进行配置,利用定时器读取串口数据的?        QFile f("/dev/ttySAC1");
        if (f.exists())
        {
                m_pCom = new Posix_QextSerialPort("/dev/ttySAC1",
                                QextSerialBase::Polling);
                if (m_pCom->open(QIODevice::ReadWrite))//ttySAC1
                {
                        m_pCom->setBaudRate(BAUD115200);
                        m_pCom->setDataBits(DATA_8);
                        m_pCom->setParity(PAR_NONE);
                        m_pCom->setStopBits(STOP_1);
                        m_pCom->setFlowControl(FLOW_OFF);
                        m_pCom->setTimeout(10);
                        m_plbComStatus->setText(
                                        trUtf8("ttySAC1 已打开 115200bps 8"));
                        m_pTimer->start(100);
                }


                else
                {
                        QMessageBox::warning(this, trUtf8("提示"),
                                        trUtf8("串口打开失败!"), QMessageBox::Ok);
                }
        }

yupei6699 发表于 2013-9-9 15:54:43 | 显示全部楼层
usleep()函数

评分

参与人数 1 +15 收起 理由
cqqjj3887 + 15

查看全部评分

 楼主| cqqjj3887 发表于 2013-9-17 14:24:25 | 显示全部楼层
yupei6699 发表于 2013-9-9 15:54
usleep()函数

已经解决了,是因为用板子自带的程序运行后,在自己的程序中运行时会获取以前串口的配置,所以每次要先运行才能正常工作,查看后是有些地方配置和板子自带的程序有所不同,谢谢你的解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-6-18 14:35 , Processed in 1.140625 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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