stm32dma串口没有收到包头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32dma串口没有收到包头相关的知识,希望对你有一定的参考价值。

参考技术A 使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位:

1)通过软件向该RXNE标志位写入零来清零;

2)通过对 USART_DR 寄存器执行读入操作将该位清零。

这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。

QT串口不工作

【中文标题】QT串口不工作【英文标题】:QT serial port not working 【发布时间】:2015-07-22 10:36:55 【问题描述】:

我正在尝试使用 USB / rs 232 电缆从串行设备写入\读取。 我很确定我的代码将“#002s”(这是一个控制代码)写入串行设备,因为

a) 串口打开

b) 串口是可写的

c) 代码成功导航“wait For Bytes Written (-1)”

d) 当使用串口嗅探器时,数据被成功写入。

我遇到的问题是我没有收到任何数据,也没有从其他设备发出数据。使用 qt 终端时,写入相同的“#002s”会产生正确的响应。

有什么想法吗?

非常感谢。

    #include "test_serial.h"
#include "ui_test_serial.h"
#include <QtSerialPort/QtSerialPort>
#include <QDebug>

QSerialPort *serial;
Test_Serial::Test_Serial(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Test_Serial)

    ui->setupUi(this);

  serial = new QSerialPort(this);
  connect(serial,SIGNAL(readyRead()),this,SLOT(serialReceived()));
  serial->setPortName("COM1");
  serial->setBaudRate(QSerialPort::Baud9600);
  serial->setDataBits(QSerialPort::Data8);
  serial->setParity(QSerialPort::NoParity);
  serial->setStopBits(QSerialPort::OneStop);
  serial->setFlowControl(QSerialPort::NoFlowControl);
  serial->open(QIODevice::ReadWrite); 

  if (serial->isOpen() && serial->isWritable())
 
  QByteArray input;

  input = "#";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  input = "0";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  input = "0";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  input = "2";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  input = "s";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  input = "\r";
  serial->write(input);
  serial->waitForBytesWritten(-1);
  serial->flush();

  serial->waitForReadyRead(100);
  QByteArray output = serial->readAll();
  ui->label_2->setText(output);




Test_Serial::~Test_Serial()

    delete ui;
    serial->close();


void Test_Serial::serialReceived()

    QByteArray output;
    output = serial->readAll();
    ui->label->setText("output");

【问题讨论】:

techneaz 感谢您的回复。现在一切正常,结果证明是时间问题。 【参考方案1】:

    如果你想写“#002s”,为什么不马上写呢?可能是串口设备在写入每个字符时无法识别控制码。

    void Test_Serial::writeDataToSerialPort()
    
        QByteArray input = QString("#002s").toLocal8Bit();
        serial->write(input);
       
    

    而且不需要这个阅读部分。

        serial->waitForReadyRead(100);
        QByteArray output = serial->readAll();
        ui->label_2->setText(output);
    

    Test_Serial::serialReceived 将在您收到来自串行设备的响应时以任何方式调用。

    您可以使用QSerialPort 中的error signal 捕获打开端口时的错误

    connect(serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(serialPortError(QSerialPort::SerialPortError)));
    
    void Test_Serial::serialPortError(QSerialPort::SerialPortError error)
    
        //Print error etc.
    
    

【讨论】:

感谢您的回答,但我的代码仍然无法正常工作。它现在真的很奇怪,因为它已经正常工作了两次,但是当我重新运行它而不改变任何东西时,它就停止了工作。当我检查了哪些“终端”输出了他们的一行时,我的程序没有输出“掩码 - 0x00000001 (EV_RXCHAR)”。再次感谢您如此迅速地回复。 你清理和重建了吗?究竟是什么不起作用? 我确实重建了它,但忘了清理它。问题是当“#002s”被发送给它时,另一个设备是为了发回一个回复,但目前它没有做任何事情。在串行端口嗅探器中,当我关闭程序“IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK) UP STATUS_CANCELLED COM1”时会出现此命令 1.您是否收到任何串行端口打开错误?这将是前。告诉您该端口是否已被其他应用程序打开。 2. "COM1" 是正确的端口吗?您可以使用QSerialPortInfo::availablePorts() 检查可用端口 3. 消息是否到达串行设备? 4. 提供您所面临的实际问题的详细信息而不是笼统的陈述将帮助这里的人解决您的问题。 你在哪里使用串口嗅探器?在串行设备端还是在运行该程序的系统上? .注意:串口嗅探器中打开的端口,QSerial Port无法打开!!【参考方案2】:

问题最终是readyread 标志仅在他们的数据要读取时才会发出。但是,我发送数据的速度太快,以至于外部设备无法接收。这意味着一些数据丢失了,因此设备从未将其识别为有效命令。

这意味着它仍在等待消息完成,因此在关闭程序时出现“IRP_MJ_DEVICE_CONTROL (IOCTL_SERIAL_WAIT_ON_MASK) UP STATUS_CANCELLED COM1”错误消息。这也解释了为什么它们在写入数据时没有错误消息。

这也解释了为什么同一个程序偶尔会设法读取数据,而有时会失败(即使没有重新构建程序,只是重新运行它。)当读取数据时,处理器负载更多,即程序在后台运行。这意味着数据传输速度较慢,因此外部设备可以识别命令并进行回复。

【讨论】:

以上是关于stm32dma串口没有收到包头的主要内容,如果未能解决你的问题,请参考以下文章

STM32使用DMA接收串口数据

STM32 DMA问题

STM32F103VET6基于STM32CubeMX创建串口中断+ DMA 不定长数据接收

STM32F4 DMA接收串口定长数据,串口每秒来1000个数据,使用DMA-Normal模式

STM32F4 DMA接收串口定长数据,串口每秒来1000个数据,使用DMA-Normal模式

STM32Cube 串口DMA发送问题