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中?
pc用串口助手给单片机发一字符串,收到的数据在LCD1602上显示,遇到问题,求大神指导