• 8895阅读
  • 17回复

[提问]两个串口通信 [复制链接]

上一主题 下一主题
离线zjfshowtime
 
只看楼主 倒序阅读 楼主  发表于: 2011-04-25
我的程序里面用到了两个串口,分别进行不同的数据通信,com1其中一个就是不断的动态接收传来的数据,判断信息正确后显示界面上,另外一个com2就是控制一个外部元件,给它发送数据,通信时候用的是不同的两个串口。但是程序运行起来后到 发送按钮让com2发送数据的时候,提示了如附件里面提示的错误,我大概了解是内存中read和write出问题了,可能是有冲突,但是不知道怎么解决,求解啊!
离线lxkjlzz
只看该作者 1楼 发表于: 2011-04-25
串口打开没,先用串口调试工具试试
离线zjfshowtime
只看该作者 2楼 发表于: 2011-04-25
回 1楼(lxkjlzz) 的帖子
我保证绝对打开了,我一直用串口调试工具监视着端口呢,端口打开了,还有别的什么可能么?
离线morriszy

只看该作者 3楼 发表于: 2011-04-25
贴代码吧!!!
VS2010+Qt4.7.0
离线zjfshowtime
只看该作者 4楼 发表于: 2011-04-25
这是初始化一个串口:  
signal_port = new Win_QextSerialPort("COM7",QextSerialBase::EventDriven);
    signal_port->open(QIODevice::ReadWrite);
    signal_port->setBaudRate(BAUD9600);
    signal_port->setDataBits(DATA_8);
    signal_port->setParity(PAR_NONE);
    signal_port->setStopBits(STOP_1);
    signal_port->setFlowControl(FLOW_OFF);
    signal_port->setTimeout(500);
这是调用串口的方法:
void CalibWizard::signal_low_potential()
{
    signal_port->open(QIODevice::ReadWrite);
    char convert[11];
    //输出2.5V电压
    uint DataFrame[11];
    DataFrame[0] = 0x00;
    DataFrame[1] = 0x10;
    DataFrame[2] = 0x10;
    DataFrame[3] = 0x05;
    DataFrame[4] = 0x00;
    DataFrame[5] = 0x01;
    DataFrame[6] = 0x02;
    DataFrame[7] = 0x00;
    DataFrame[8] = 0x01;
    uint CRCData = CRC16(DataFrame,9);//原来数据长度为9,10位和11位是计算出来的
    DataFrame[10] = CRCData >> 8;//原来的高给低
    CRCData <<= 8;//低位移到高位
    DataFrame[9] = CRCData >> 8;//再把高位移下来
    for(int i = 0; i < sizeof(DataFrame);i++)
    {
        convert=DataFrame;
    }
    signal_port->write(convert,sizeof(convert));
}
我通过注释 signal_port->write(convert,sizeof(convert));这句话就能正常运行,你们看看吧!
离线wxj120bw

只看该作者 5楼 发表于: 2011-04-26
你调式了吗 出错停在那行代码了
离线morriszy

只看该作者 6楼 发表于: 2011-04-26
是不是要开Thread ?
VS2010+Qt4.7.0
离线zjfshowtime
只看该作者 7楼 发表于: 2011-04-26
回 5楼(wxj120bw) 的帖子
就是我说的那行代码,signal_port->write(convert,sizeof(convert));
离线zjfshowtime
只看该作者 8楼 发表于: 2011-04-26
回 6楼(morriszy) 的帖子
我不懂这里面的thread。麻烦给说一下使用的流程,我试试,谢谢了!
离线dbzhang800

只看该作者 9楼 发表于: 2011-04-26
1. 不清楚你这个QextSerialPort版本是在哪儿下的,下载处有没有详细介绍。
  * 是已经停止更新的 http://sourceforge.net/projects/qextserialport/
  * 还是新地址但也长期没更新的 http://code.google.com/p/qextserialport/

2. 它自带的例子你有没试过,能否正常工作?

3. 或者你可以试试 http://code.google.com/r/dbzhang800-qextserialport/
离线morriszy

只看该作者 10楼 发表于: 2011-04-26
回 8楼(zjfshowtime) 的帖子
我自己的串口通讯,我都开了线程
1.主线程用于界面,更新界面
2.次线程,用于发送接收数据

你COM1能正常使用吗?
VS2010+Qt4.7.0
离线zjfshowtime
只看该作者 11楼 发表于: 2011-04-26
回 9楼(dbzhang800) 的帖子
如果我只开一个串口的话 在release模式下是正常运行的,但是再打开第二个之后能,就出现了这个问题,可能是两个代码的写入和读取部分冲突了,但是这都是write的,我也不知道怎么区分开
离线zjfshowtime
只看该作者 12楼 发表于: 2011-04-26
回 10楼(morriszy) 的帖子
恩,没问题的,就是因为功能扩展之后,由于波特率不一样,com1是57600,com7是9600,波特率由系统需要决定的,不可以修改的,没办法,因此需要的两个串口,我就添加的串口,现在出这样的错误了
离线dbzhang800

只看该作者 13楼 发表于: 2011-04-26
Re:回 9楼(dbzhang800) 的帖子
引用第11楼zjfshowtime于2011-04-26 15:38发表的 回 9楼(dbzhang800) 的帖子 :
如果我只开一个串口的话 在release模式下是正常运行的,但是再打开第二个之后能,就出现了这个问题,可能是两个代码的写入和读取部分冲突了,但是这都是write的,我也不知道怎么区分开

我在一个程序中8个串口同时读写(7个是QextSerialport,另一个是第三方ActiveX控件),没发现什么问题。
离线morriszy

只看该作者 14楼 发表于: 2011-04-26
回 13楼(dbzhang800) 的帖子
人家八个COM都没有问题,看来是楼主的代码有问题!呵呵
VS2010+Qt4.7.0
离线zjfshowtime
只看该作者 15楼 发表于: 2011-04-26
        兄弟们,我刚把问题解决了,前面的很多人都说的对,是有数组没有初始化,我刚才也问了一个朋友,他说release模式和debug模式的主要区别是代码的优化,而我的这段代码出了问题:
for(int i = 0; i < sizeof(DataFrame);i++)
    {
        convert=DataFrame;      
    }
        这里的dataframe是uint类型的,而convert数组是char类型的,在使用sizeof函数的时候有区别,sizeof(dataframe)= 44,而sizeof(convert) = 11,这个区别就导致了初始化的时候,有很多为定义的数组被初始化而导致错误,希望大家也能吸取我的教训吧,就这个问题,我弄了4天!
    也谢谢大家这么长时间的帮助,哈哈,我是菜鸟,希望大家以后继续关注我,有时间我也多看看大家的帖子,真的谢谢了!!
离线zjfshowtime
只看该作者 16楼 发表于: 2011-04-26
兄弟们,我刚把问题解决了,前面的很多人都说的对,是有数组没有初始化,我刚才也问了一个朋友,他说release模式和debug模式的主要区别是代码的优化,而我的这段代码出了问题:
for(int i = 0; i < sizeof(DataFrame);i++)
    {
        convert=DataFrame;      
    }
        这里的dataframe是uint类型的,而convert数组是char类型的,在使用sizeof函数的时候有区别,sizeof(dataframe)= 44,而sizeof(convert) = 11,这个区别就导致了初始化的时候,有很多为定义的数组被初始化而导致错误,希望大家也能吸取我的教训吧,就这个问题,我弄了4天!
    也谢谢大家这么长时间的帮助,哈哈,我是菜鸟,希望大家以后继续关注我,有时间我也多看看大家的帖子,真的谢谢了!!  
离线zjfshowtime
只看该作者 17楼 发表于: 2011-04-26
        我的程序现在运行正常了,希望大家的问题也都能在qt中文论坛得到解决,也祝咱们qt中文论坛越来越好!大家都在这个开源社区里面真的能够学到东西!
快速回复
限100 字节
 
上一个 下一个