ljddtrhf 发表于 2024-12-18 19:39:47

我在用AI8H8K64U搭配BL0942读取交流电的电压电流,这个代码始终编译错误 (

<pre><code>#define ST7735S_TFT_LCD_RESETP3_6
#define ST7735S_TFT_LCD_RESET_OUT{P3M1&amp;=~0x40;P3M0|=0x40;}//P3_6推挽输出
#define ST7735S_TFT_LCD_CSP0_5
#define ST7735S_TFT_LCD_CS_OUT{P0M1&amp;=~0x20;P0M0|=0x20;}//P0_5推挽输出
#define ST7735S_TFT_LCD_A0P3_7
#define ST7735S_TFT_LCD_A0_OUT{P3M1&amp;=~0x80;P3M0|=0x80;}//P3_7推挽输出
#define ST7735S_TFT_LCD_SDAP3_5
#define ST7735S_TFT_LCD_SDA_OUT{P3M1&amp;=~0x20;P3M0|=0x20;}//P3_5推挽输出
#define ST7735S_TFT_LCD_SCLP3_2
#define ST7735S_TFT_LCD_SCL_OUT{P3M1&amp;=~0x04;P3M0|=0x04;}//P3_2推挽输出
#define TFT_LCD_LCD_W128
#define TFT_LCD_LCD_H160
#define ST7735S_draw_line
#define ST7735S_draw_circle
#define ST7735S_draw_triangel
#define ST7735S_show_char
#define ST7735S_draw_bmp16
#define TFT_LCD_DIZI_X0
#define TFT_LCD_DIZI_Y0

#include &lt;STC8HX.h&gt;
uint32 sys_clk = 24000000;//设置PWM、定时器、串口、EEPROM频率参数
#include &quot;lib/twen_board.h&quot;
#include &quot;mylib/ST7735S_tftlcd.h&quot;
#include &quot;lib/delay.h&quot;

// 定义相关宏,根据实际情况调整以下参数
#define V_REF 1.218   // 内置参考电压 (V)
#define RL_CURRENT 5   // 采样电阻 (毫欧),这里会影响屏幕显示的电流准确度,改为实际的阻值就好
#define R2_VOLTAGE 1940    // 分压网络电阻 (K欧),确定了屏幕上显示的电压,可适当修改阻值让电压显示的正确范围
#define R1_VOLTAGE 0.51    // 分压网络电阻 (K欧)
#define SERIAL_RX_MAXLEN 23// 串口接收数据缓冲区的最大长度

// 串口接收数据数组
static char serial_data;
const byte sendCommandBytes[] = {0X58, 0XAA}; // 发送的命令字节

// 初始化BL0942芯片对应的串口通信(使用STC8H8K64U第2个串行通信UART接口P1.0 (RxD2) 和 P1.1 (TxD2))
void Init_BL0942(void)
{
    // 配置串口相关参数,波特率等,这里需根据实际情况调整
    SCON2 = 0x50;// 8位数据,可变波特率,允许接收
    TMOD &amp;= 0x0F;
    TMOD |= 0x20;// 定时器1工作在方式2(8位自动重装)
    TH1 = 0xFD;    // 波特率4800(根据实际晶振频率等可能需要调整)
    TL1 = 0xFD;
    TR1 = 1;       // 启动定时器1
    ES2 = 1;       // 允许串口2中断
    EA = 1;      // 开总中断
}

// 发送命令给BL0942
void sendCommand(void)
{
    for (int i = 0; i &lt; sizeof(sendCommandBytes); i++) {
      S2BUF = sendCommandBytes;
      while (!TI2);
      TI2 = 0;
    }
}

// 接收BL0942数据
void receiveData(void)
{
    static uint8_t data_index = 0;
    static bool frame_start = false;

    // 清空数据缓冲区
    if (!frame_start) {
      memset(serial_data, 0, SERIAL_RX_MAXLEN);
    }

    if (RI2)
    {
      char temp_data = S2BUF;
      RI2 = 0;

      if (temp_data == 0x55) // 判断帧头
      {
            frame_start = true;
            data_index = 0;
      }

      if (frame_start &amp;&amp; data_index &lt; SERIAL_RX_MAXLEN)
      {
            serial_data = temp_data;

            // 当接收到预期数量的数据时停止接收
            if (data_index &gt;= SERIAL_RX_MAXLEN)
            {
                frame_start = false;

                // 校验和验证
                uint8_t checksum = 0;
                for (uint8_t i = 0; i &lt; SERIAL_RX_MAXLEN - 1; i++) {
                  checksum += serial_data;
                }
                checksum = ~checksum &amp; 0xFF;

                if (checksum!= serial_data) {
                  // 数据包校验失败,丢弃数据
                  return; // 如果校验失败,直接返回不处理该数据包
                }
                // 校验成功后可以继续处理数据
            }
      }
    }
}

// 获取电流
float getCurrent(void)
{
    uint32_t parm = ((uint32_t)serial_data &lt;&lt; 16) | ((uint32_t)serial_data &lt;&lt; 8) | serial_data;
    float current = (float)parm * V_REF * 1000 / (305978 * RL_CURRENT);// mA
    return current / 1000; // 将mA转换为A
}

// 获取电压
float getVoltage(void)
{
    uint32_t parm = ((uint32_t)serial_data &lt;&lt; 16) | ((uint32_t)serial_data &lt;&lt; 8) | serial_data;
    float voltage = (float)parm * V_REF * (R2_VOLTAGE + R1_VOLTAGE) / (73989 * R1_VOLTAGE * 1000);
    return voltage;
}

// 显示电压、电流到TFT屏幕
void displayVoltageCurrentAndPower()
{
    float voltage = getVoltage();
    float current = getCurrent();

    tft_ST7735S_clear((TFT_LCD_GBLUE));

    // 设置显示电压的位置等相关属性
    tft_ST7735S_show_font16(&quot;电压:&quot;,11,11,(TFT_LCD_RED),(TFT_LCD_GBLUE),0);
    char voltage_str;
    sprintf(voltage_str, &quot;%.3f V&quot;, voltage);
    tft_ST7735S_show_font16(voltage_str, 50, 11, (TFT_LCD_RED),(TFT_LCD_GBLUE),0);

    // 设置显示电流的位置等相关属性
    tft_ST7735S_show_font16(&quot;电流:&quot;,11,33,(TFT_LCD_BLACK),(TFT_LCD_GBLUE),1);
    char current_str;
    sprintf(current_str, &quot;%.3f A&quot;, current);
    tft_ST7735S_show_font16(current_str, 50, 33, (TFT_LCD_BLACK),(TFT_LCD_GBLUE),1);
}

// 初始化相关设置
void setup()
{
    twen_board_init();//天问51初始化
    //TFT屏1.8寸ST7735S显示全部正确
    tft_ST7735S_init();//TFT初始化
    tft_ST7735S_direction(2); //设置屏幕方向

    Init_BL0942(); // 初始化BL0942芯片对应的串口通信
}

// 主循环
void loop()
{
    sendCommand(); // 发送指令
    delay(100);    // 等待一段时间让BL0942响应
    receiveData(); // 接收数据

    displayVoltageCurrentAndPower(); // 显示电压、电流

    delay(1000);      // 延迟秒后再次更新数据
}

// 主函数
void main(void)
{
    setup();
    while(1){
      loop();
    }
}







上面的代码编译后出现了下面的错误提示,始终没能修好,发上来请大师们帮忙研究研究

twen/main.c:41:syntax error:token-&gt;'sendcommandBytes:column 27
</code></pre>
<p>的代码编译后出现了下面的错误提示,始终没能修好,发上来请大师们帮忙研究研究</p>
<p>twen/main.c:41:syntax error:token-&gt;'sendcommandBytes:column 27</p>

DebugLab 发表于 2024-12-18 20:17:01

#define sendCommandBytesLenth 2
const byte sendCommandBytes = {0X58, 0XAA}; // 发送的命令字节
for (int i = 0; i < sendCommandBytesLenth; i++)
{
      S2BUF = sendCommandBytes;
      while (!TI2);
      TI2 = 0;
}
页: [1]
查看完整版本: 我在用AI8H8K64U搭配BL0942读取交流电的电压电流,这个代码始终编译错误 (