52单片机通过usb 串口发送数据给linux,minicom来接收

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了52单片机通过usb 串口发送数据给linux,minicom来接收相关的知识,希望对你有一定的参考价值。

在window下,串口调色精灵可以收到单片机发来的数据,但是minicom就是接收不到,就指导

在Linux下首先要对minicom进行下串口设置,你可以看下/dev/下的设备,你插入串口的话,会多出来哪个设备,往往都是/dev/ttyUSB*,具体自己看下.设置minicom的话,命令是:minicom -s,也可以自己去找资料.在minicom里要把串口还有波特率都设置好,与单片机代码相符合的波特率.设置好minicom之后重开minicom,这个时候你收发的话,minicom就会显示出接收到的数据了. 参考技术A minicom 要设定波特率之类的才行,也就是说使用前要设置minicom.另外minicom不同于串口助手。相当与windows下的超级终端。追问

我设置过了的,我用的是usb串口,是不是与普通的串口一样

追答

你先把串口接收和发送线短接,看看minicom上发数据是不是会显示回来,这是最基本的串口调试方法,如果发东西没有回来的话,就说明你的minicom没有设置好,具体的设定方法请百度查查。

参考技术B 这个东西很麻烦的,usb接口是48m的晶振,usb转串口是四分频的也就是12m的,单片机一般用11.0592m,晶振不统一,不管使用那款晶振兼容性都不好,除非使用双晶振的转换器,价格不会低于50人民币的。

读写串口 类QSerialPort

参考技术A 背景:一个串口下位机(黑盒子)我每次发送数据,黑盒子都会发送回来状态,

测试情况1

1、自定义一个类myQSerialPort 继承QSerialPort,槽函数接收回复的状态(发送的信号量为AA,BB) (QSerialPort 改为成员变量依旧有这个问题)

定义了变量 m__myQSerialPort,有一个写方法 B(B方法组织数据并发送数据)

m_mutex.lock();//m_mute为QMutex

发送

m_mutex.unlock();

我是在线程  发送完数据,等到接收到 回复的状态在继续执行

2、一个 线程类 myQThread 发送信号量  A , 然后主线程 发送数据,接收到信号 AA 线程继续运行,

3、主线程中有一个定时器调用 m__myQSerialPort.B(),

等到BB信号量  ,

测试结果发现有时 发送信号量完 A会出现线程不继续执行了, 最后使用串口监控软件,m__myQSerialPort.B()发送的数据和信号量完A发送的 数据被一下 发送给黑盒子了,其不能正常解析,所以就收不到 AA信号量, 线程就 不能执行了, 

串口例子

myserial::myserial()



    m_pCurrThread = new QThread;

    m_pSerial = new QSerialPort;

    this->moveToThread(m_pCurrThread);

    m_pSerial->moveToThread(m_pCurrThread);

    connect(m_pCurrThread, &QThread::started, this, &myserial::OpenSerial);

    connect(this, &myserial::SignalWriteData, this, &myserial::WriteData);

    m_pCurrThread->start();



void myserial::readyRead()



    qDebug()<<"readyRead = "<<QThread::currentThreadId()<<"\n";

    qDebug() << m_pSerial->readAll().length();



void myserial::OpenSerial()



    qDebug()<<"OpenSerial = "<<QThread::currentThreadId()<<"\n";

    m_pSerial->setPortName(QString("COM4"));

    m_pSerial->setBaudRate( 115200 );

    m_pSerial->setDataBits(QSerialPort::Data8);

    m_pSerial->setParity(QSerialPort::NoParity);

    m_pSerial->setStopBits(QSerialPort::OneStop);

    m_pSerial->open(QIODevice::ReadWrite);

    connect(m_pSerial, &QSerialPort::readyRead, this, &myserial::readyRead,Qt::QueuedConnection);



void myserial::run()



    unsigned char data[6] = 0X5E,1,1,0,6,0x66 ;

    qDebug()<<"run = "<<QThread::currentThreadId()<<"\n";

    for( int i =0;i< 30;i++)

   

        emit SignalWriteData();

        QThread::sleep(1);

   



void myserial::WriteData()



    qDebug()<<"WriteData = "<

    unsigned char data[6] = 0X5E,1,1,0,6,0x66 ;

    if( m_pSerial->write( (char*)data, 6) < 0 )

        qDebug() <<"write fail";



//以上办法 是在在 槽函数中打开 串口,在构造函数中mobetothread

//以下改为在 公有的成员函数中 打开串口 然后moveToThread

#include "myserial.h"

#include

myserial::myserial()



    m_pCurrThread = new QThread;

    m_pSerial = new QSerialPort;

    this->moveToThread(m_pCurrThread);

    //connect(m_pCurrThread, &QThread::started, this, &myserial::OpenSerial);

    connect(this, &myserial::SignalWriteData, this, &myserial::WriteData);

    m_pCurrThread->start();



void myserial::readyRead()



    qDebug()<<"readyRead = "<<QThread::currentThreadId()<<"\n";

    qDebug() << m_pSerial->readAll().length();



bool myserial::OpenSerial()



    qDebug()<<"OpenSerial = "<<QThread::currentThreadId()<<"\n";

    m_pSerial->setPortName(QString("COM5"));

    m_pSerial->setBaudRate( 115200 );

    m_pSerial->setDataBits(QSerialPort::Data8);

    m_pSerial->setParity(QSerialPort::NoParity);

    m_pSerial->setStopBits(QSerialPort::OneStop);

    bool tf = m_pSerial->open(QIODevice::ReadWrite);

    //m_pSerial->moveToThread(m_pCurrThread);//都可以

    QMetaObject::Connection aa = connect(m_pSerial, &QSerialPort::readyRead, this, &myserial::readyRead,Qt::QueuedConnection);

    m_pSerial->moveToThread(m_pCurrThread);

    return tf;



void myserial::run()



    unsigned char data[6] = 0X5E,1,1,0,6,0x66 ;

    qDebug()<<"run = "<<QThread::currentThreadId()<<"\n";

    for( int i =0;i< 30;i++)

   

        emit SignalWriteData();

        QThread::sleep(1);

   



void myserial::WriteData()



    qDebug()<<"WriteData = "<<QThread::currentThreadId()<<"\n";

    unsigned char data[6] = 0X5E,1,1,0,6,0x66 ;

    if( m_pSerial->write( (char*)data, 6) < 0 )

        qDebug() <<"write fail";

以上是关于52单片机通过usb 串口发送数据给linux,minicom来接收的主要内容,如果未能解决你的问题,请参考以下文章

52单片机如何对PC串口发送来的数据进行存储,存储在哪?RAM还是ROM中?

CC2530 串口收发字符串

pc用串口助手给单片机发一字符串,收到的数据在LCD1602上显示,遇到问题,求大神指导

虚拟机linux下用usb 转串口线,minicom连接SBC2410板,能接收数据,但是不能发送数据?

怎么用usb转TTL线给单片机下载程序,线是怎么接的?

CMSIS-DAP硬件调试--ARM核单片机仿真调试工具