天天看点

上下位机:嵌入式工程中的默契(代码解析)

作者:北京老白
上下位机:嵌入式工程中的默契(代码解析)

嵌入式工程中的上位机和下位机是相互配合的两个部分。上位机通常是指运行在PC或服务器上的软件程序,用于与下位机进行通信、控制和数据交互。下位机是指嵌入在嵌入式系统中的微控制器或处理器,负责执行具体的任务、控制硬件设备,并通过与上位机的通信实现数据传输和命令执行。上位机通过与下位机的通信接口(如串口、以太网等)发送指令或请求数据,下位机接收并解析上位机的指令,并执行相应的操作或采集数据返回给上位机。上下位机之间的交互实现了嵌入式系统的远程控制、数据采集和监测功能。

下面是一个下位机C语言的数据解析代码示例:

#include <stdio.h>

typedef struct {
    int id;
    float temperature;
    float humidity;
} SensorData;

void parseData(const unsigned char *data, SensorData *sensorData) {
    // 从data中解析出id,temperature和humidity的值,并存入sensorData结构体中
    sensorData->id = (data[0] << 8) | data[1];
    sensorData->temperature = (float)((data[2] << 8) | data[3]) / 100;
    sensorData->humidity = (float)((data[4] << 8) | data[5]) / 100;
}

int main() {
    unsigned char rawData[6] = {0x02, 0x01, 0x2C, 0x01, 0x6B, 0x01};
    SensorData sensorData;

    parseData(rawData, &sensorData);

    printf("ID: %d\n", sensorData.id);
    printf("Temperature: %.2f\n", sensorData.temperature);
    printf("Humidity: %.2f\n", sensorData.humidity);

    return 0;
}           

上述代码中,首先定义了一个SensorData结构体,用于存储传感器数据。结构体中包含了id、温度和湿度这三个字段。

parseData函数用于解析数据,该函数接受一个指向无符号字符数组的指针data和一个指向SensorData结构体的指针sensorData作为参数。函数内部使用位运算和类型转换将data中的原始字节数据解析为对应的整数和浮点数,并将解析结果存入sensorData结构体中。

在main函数中,定义了一个unsigned char类型的数组rawData,用于存储原始的字节数据。然后创建一个SensorData类型的变量sensorData。

接下来调用parseData函数,将rawData和sensorData的地址作为参数传入,解析数据并将结果存入sensorData结构体中。

最后通过printf函数打印出解析后的数据,包括id、温度和湿度。

以下是C#上位机数据编码程序的示例:

using System;

struct SensorData
{
    public int id;
    public float temperature;
    public float humidity;
}

class Program
{
    static byte[] EncodeData(SensorData sensorData)
    {
        byte[] data = new byte[6];
        
        data[0] = (byte)(sensorData.id >> 8);  // id的高8位
        data[1] = (byte)(sensorData.id & 0xFF);  // id的低8位
        
        int temp = (int)(sensorData.temperature * 100);
        data[2] = (byte)(temp >> 8);  // 温度的整数部分的高8位
        data[3] = (byte)(temp & 0xFF);  // 温度的整数部分的低8位
        
        int humi = (int)(sensorData.humidity * 100);
        data[4] = (byte)(humi >> 8);  // 湿度的整数部分的高8位
        data[5] = (byte)(humi & 0xFF);  // 湿度的整数部分的低8位
        
        return data;
    }
    
    static void Main()
    {
        SensorData sensorData;
        sensorData.id = 513;
        sensorData.temperature = 44.5f;
        sensorData.humidity = 107.5f;
        
        byte[] encodedData = EncodeData(sensorData);
        
        foreach (byte b in encodedData)
        {
            Console.Write(b.ToString("X2") + " ");
        }
    }
}           

上述代码中,首先定义了一个SensorData结构体,用于存储传感器数据。结构体中包含了id、温度和湿度这三个字段。

EncodeData函数用于对传感器数据进行编码,该函数接受一个SensorData结构体作为参数,并返回一个byte数组。函数内部将传感器数据中的整数部分乘以100,然后通过位运算将整数部分和小数部分拆分为高8位和低8位,并存入byte数组中。

在Main函数中,首先创建一个SensorData类型的变量sensorData,并为其赋值。然后调用EncodeData函数将sensorData编码为byte数组。

最后通过foreach循环遍历encodedData数组,并使用Console.Write函数将每个字节以十六进制形式打印出来。

继续阅读