「已注销」 2023-03-17 09:42 采纳率: 50%
浏览 37
已结题

如何在51单片机通过串口接收整型数组,并逐一提取内部元素到指定变量

目前在做一个单片机倒计时时钟,思路是上位机设定好时分秒,打包成数组通过串口发到单片机下位机。现在不知道单片机这边怎么编程序才能接受数组并将数组内部元素提出来。
目前的思路是单片机这边写一个三元素数组对接,先把传过来的数据放进数组再赋值给变量,但是不知道怎么接受和提取数组。
希望大家能够提出宝贵的意见,谢谢大家。

  • 写回答

6条回答 默认 最新

  • qllaoda 2023-03-17 11:21
    关注

    通讯的话,建议先根据协议的定义一个收发数据结构体,发送方定义一个结构体变量,把结构体各个成员都填充完成。然后发送的时候把结构体指针强制转换成char数组发送。接收的时候反过来,先接收一个char数组里,然后把cha指针强制转换成结构体指针,就可以通过结构体直接读出各个成员。
    需要注意两边的大小端模式是否一致,不一致需要转换

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • 「已注销」 2023-03-17 09:52
    关注

    参考GPT和自己的思路:

    好的,针对您的问题,我可以给您提供以下方案:

    1. 首先,在单片机端设置好串口通信参数,例如波特率、数据位、校验位等,并打开串口中断。

    2. 接着,当上位机发送数组数据时,单片机通过串口接收到数据后,可以将其存放到一个缓冲区中,可以使用一个指针来指向这个缓冲区,然后依次提取数组中的元素。

    3. 对于提取数组元素的过程,您可以使用一个循环来实现,例如 for 循环,它可以遍历数组中的每个元素,将其赋值给指定的变量,然后将该变量用于倒计时时钟的计算。

    4. 最后,您需要将处理后的数据通过液晶显示模块或者其他方式显示出来,让用户可以直观地了解倒计时的状态。

    建议您根据具体情况来逐步实现这些步骤,同时也可以参考一些现成的资料和代码,快速入门和理解单片机的串口通信和数据处理流程。祝您编写成功!

    评论
  • threenewbee 2023-03-17 09:53
    关注

    先读取到缓冲区,然后循环转换,要注意大端序和小端序的问题

    评论
  • 追cium 2023-03-17 09:55
    关注

    参考GPT和自己的思路:

    首先,要在51单片机通过串口接收整型数组,需要了解串口通信中数据的传输格式。具体可参考串口通信协议相关资料。

    其次,在接收到数据后,需要用相应的代码进行解析,提取内部元素并赋值给指定变量。以下是一个简单的示例代码:

    int data[3];  // 定义一个三元素整型数组用于接收数据
    
    void main()
    {
        int i;
        for(i = 0; i < 3; i++) {  // 循环接收三个整数数据
            data[i] = receive();  // 调用receive()函数接收一个整数数据
        }
        int hour = data[0];  // 把data[0]赋值给变量hour
        int minute = data[1];  // 把data[1]赋值给变量minute
        int second = data[2];  // 把data[2]赋值给变量second
    }
    
    int receive()
    {
        int num = 0;  // 定义一个变量用于存放接收到的整型数据
        // 在这里编写串口通信代码,接收一个整型数据
        // 然后将接收到的数据赋值给num变量
        return num;  // 返回接收到的数据
    }
    

    以上代码示例仅供参考,具体实现方式可根据具体情况进行修改。在这个例子中,我们首先定义了一个三元素整型数组data,用于存放接收到的数据。接着,用循环语句依次接收三个整数数据,并存放到data数组中。最后,通过使用数组下标的方式将data数组中的元素提取出来赋值给指定的变量。

    在实现串口通信时,需要考虑数据的传输格式以及数据的校验等相关问题。建议在开始实现之前,先查找相关的资料进行学习和理解。希望这些信息能对你有所帮助!

    评论
  • MarkHan_ 2023-03-17 10:16
    关注

    该回答引用GPTᴼᴾᴱᴺᴬᴵ
    您可以通过串口接收数据,然后逐一提取内部元素到指定变量。以下是可能的实现方式:

    1. 首先需要定义一个接收缓冲区,用来存放接收到的数据。缓冲区可以是一个全局变量数组。缓冲区大小应该大于接收的数据长度。
    2. 在串口接收中断中,每次接收到一个字节数据,将其存放在接收缓冲区中,并将计数器加1。如果接收缓冲区已经满了,或者接收到了结束符(例如换行符或空格),则将接收到的数据转换成整型数据,逐一提取内部元素到指定变量。
    3. 如果要发送整型数组,可以将数组元素转换成字符串,然后在每个元素之间添加分隔符,例如逗号。在单片机接收数据时,可以将接收到的字符串按照分隔符进行分割,并将分割后的字符串转换成整型数据,存放在数组中。然后逐一提取内部元素到指定变量。

    下面是一个示例代码:

    // 定义接收缓冲区
    #define BUFFER_SIZE 20
    unsigned char buffer[BUFFER_SIZE];
    unsigned char count = 0;
    
    // 定义整型数组
    #define ARRAY_SIZE 3
    int array[ARRAY_SIZE];
    
    // 串口接收中断服务函数
    void uart_isr() interrupt UART_VECTOR {
        if (RI) {  // 接收中断
            buffer[count++] = SBUF;  // 存储接收到的数据
            if (count == BUFFER_SIZE || buffer[count - 1] == '\n') {  // 接收缓冲区已满或者接收到了结束符
                // 转换成整型数组
                char* ptr = strtok(buffer, ",");  // 分割字符串
                for (int i = 0; i < ARRAY_SIZE; i++) {
                    array[i] = atoi(ptr);  // 字符串转换成整型
                    ptr = strtok(NULL, ",");
                }
                // 逐一提取内部元素到指定变量
                int hour = array[0];
                int minute = array[1];
                int second = array[2];
                // 清空接收缓冲区
                count = 0;
            }
            RI = 0;  // 清除接收中断标志
        }
    }
    
    
    

    上述代码实现了从串口接收整型数组,并逐一提取内部元素到指定变量的功能。当接收缓冲区已满或者接收到了结束符时,将接收到的数据转换成整型数组,并将数组元素提取到指定变量中。请根据您的具体需求进行修改和优化。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-18 13:49
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月19日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 神经网络建立应力预测模型
  • ¥20 反编译一款APP手游,解密出lua脚本。
  • ¥15 改一下,代码,让代码符合要求
  • ¥15 报错问题,只有两个错误,如图片所示,i多次初始化
  • ¥15 matlab runtime 如何收费
  • ¥15 Tpad api账户 api口令
  • ¥30 ppt进度条制作,vba语言
  • ¥15 生信simpleaffy包下载
  • ¥15 在二层网络中,掩码存在包含关系即可通信
  • ¥15 端口转发器解析失败不知道电脑设置了啥