OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5532|回复: 12

QT异步串口通讯控制led灯的亮灭

[复制链接]

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
发表于 2020-10-18 21:37:48 | 显示全部楼层 |阅读模式
5金钱
请大佬指点
本人想通过QT编写串口通信,想在qt上的页面发送“1”,实现红灯亮,发送“0”,实现红灯灭,发送“开启”,绿灯亮,发送“关闭”,绿灯灭,通过stm官网的串口助手,已经实验控制灯的亮灭,但是在QT上面不能实现。
if(USART_RX_STA &0x8000 )
                {
                       
                                USART_RX_STA = 0;
                       
                        if(USART_RX_BUF[0] == '1')
                        {
                                LED0 = 1;
                       
                        }
                        if(USART_RX_BUF[0] == '0')
                        {
                                LED0 = 0;
                       
                        }                               
                       
                                {
                            LED1=0;//PC13
       
                        }
      if(!(strcmp(USART_RX_BUF,"开启")))
                        {
                            LED1=1;

                        }
                       

最佳答案

查看完整内容[请看2#楼]

在QT上面不能实现发送“开启”/“关闭”这样子的汉字来控制led吧?发送“0”/“1”这样的数组控制led应该没问题吧? 如果是上面的猜测的话,那就是QT5中汉字的默认编码是utf-8,而你单片机的汉字编码不是utf-8导致的。 utf-8编码,英文用1byte,汉字用3byte GBK/GB2312编码,英文用1byte,汉字用2byte。 你用“0”/“1”控制应该没问题,它们都是0x30 0x31;但是你用“开启”/“关闭”来控制就要注意QT和单片机的汉字编码格式 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-10-18 21:37:49 | 显示全部楼层
在QT上面不能实现发送“开启”/“关闭”这样子的汉字来控制led吧?发送“0”/“1”这样的数组控制led应该没问题吧?

如果是上面的猜测的话,那就是QT5中汉字的默认编码是utf-8,而你单片机的汉字编码不是utf-8导致的。
utf-8编码,英文用1byte,汉字用3byte
GBK/GB2312编码,英文用1byte,汉字用2byte。
你用“0”/“1”控制应该没问题,它们都是0x30 0x31;但是你用“开启”/“关闭”来控制就要注意QT和单片机的汉字编码格式了。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2020-10-19 19:55:20 | 显示全部楼层
既然可以用串口助手实现,那单片机这端就可以咯,然后你在QT上写个串口助手不就行咯
回复

使用道具 举报

5

主题

152

帖子

0

精华

高级会员

Rank: 4

积分
777
金钱
777
注册时间
2016-7-15
在线时间
119 小时
发表于 2020-10-20 09:00:44 | 显示全部楼层
简简单单
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-20 09:56:35 | 显示全部楼层
245925587 发表于 2020-10-19 19:55
既然可以用串口助手实现,那单片机这端就可以咯,然后你在QT上写个串口助手不就行咯

串口助手试了好多例子,不能用,是不是串口发送的数据有问题啊?
QT代码如下:
void MainWindow:n_sendButtton_clicked()//发送数据
{


    QByteArray SendBytes = SendInfo->toPlainText().toLatin1();//toPlainText(将文本编辑的文本转换为纯文本)


    if(SendBytes.isEmpty())//判断发送数据是否为空
     {
            StatusOfDock3->append("No message can be sent, Please write something");
     }

    CurrentPort->write(SendBytes);
}


void MainWindow::Read_Data()//读取接收到的数据
{
    QByteArray buf;
    buf = CurrentPort->readAll();//Qbytearray类提供一个字节数组,buf这里应该是缓冲数据的功能


    if(!buf.isEmpty())
    {
        QString str = this->ReceiveInfo->toPlainText().toUtf8();
        str += tr(buf);//???
        ReceiveInfo->clear();
        ReceiveInfo->append(str);

    }
    buf.clear();
}
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-20 09:57:38 | 显示全部楼层
17864114986 发表于 2020-10-20 09:56
串口助手试了好多例子,不能用,是不是串口发送的数据有问题啊?
QT代码如下:
void MainWindow:n_se ...

还是说发送的数据为纯文本,与单片机的数据不匹配?
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4947
金钱
4947
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-10-20 11:35:01 | 显示全部楼层
你用回环检查一下上位机发送的数据跟之前你用串口助手发送的数据是否一致
回复

使用道具 举报

29

主题

162

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2018-4-25
在线时间
185 小时
发表于 2020-10-20 14:47:16 | 显示全部楼层
QT读取文本的文字,如果是打开就发1,是关闭就发0嘛
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-20 15:29:34 | 显示全部楼层
szczyb1314 发表于 2020-10-20 13:54
在QT上面不能实现发送“开启”/“关闭”这样子的汉字来控制led吧?发送“0”/“1”这样的数组控制led应该没 ...

解决了  既然我不知道QT端发送给单片机的数据是什么,我就用QT接收数据,通过单片机发送给qt数据1,确定1没问题,然后发送就成功了。
之前一直没成功的原因是因为发送的数据没有加插入换行
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-20 15:30:06 | 显示全部楼层
szczyb1314 发表于 2020-10-20 13:54
在QT上面不能实现发送“开启”/“关闭”这样子的汉字来控制led吧?发送“0”/“1”这样的数组控制led应该没 ...

解决了  既然我不知道QT端发送给单片机的数据是什么,我就用QT接收数据,通过单片机发送给qt数据1,确定1没问题,然后发送就成功了。
之前一直没成功的原因是因为发送的数据没有加插入换行
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-20 15:52:57 | 显示全部楼层
szczyb1314 发表于 2020-10-18 21:37
在QT上面不能实现发送“开启”/“关闭”这样子的汉字来控制led吧?发送“0”/“1”这样的数组控制led应该没 ...

你好  我还有一个问题  QT接受窗口会显示单片机发送的数据,但是QT此时如果发送数据1的话,接收窗口就会出现卡顿不显示接收的情况。我想在QT中实现接收和发送同步,可以实现吗,使用的是串口异步通信。C:\Users\15253\Desktop\1603180297(1).jpg
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-10-26 12:30:13 | 显示全部楼层
17864114986 发表于 2020-10-20 15:52
你好  我还有一个问题  QT接受窗口会显示单片机发送的数据,但是QT此时如果发送数据1的话,接收窗口就会 ...

一般的,开线程处理接收(接收是被动的),发送随便处理就行(发送是自己控制的)
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

7

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2020-6-3
在线时间
45 小时
 楼主| 发表于 2020-10-28 15:39:03 | 显示全部楼层
szczyb1314 发表于 2020-10-26 12:30
一般的,开线程处理接收(接收是被动的),发送随便处理就行(发送是自己控制的)

好的  谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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