|
单片机是STC8H8K64U,使用串口2连接HLW8110,波特率9600,偶校验,将串口2的tx连到usb转串口模块能正确收到数据,用串口模块发送数据8110也能返回数据,但单片机发出的数据8110没有返回,串口2代码
uart2.h
- #ifndef __UART2_H__
- #define __UART2_H__
- #include <STC8H.H>
- #include "config.h"
- #define BAUDRATE 9600 // 波特率
- #define BRT2 (65536 - (MAIN_FOSC / BAUDRATE + 2) / 4) // 加 2 操作是为了让Keil编译器//自动实现四舍五入运算
- // #define UART2_BUF_LENGTH 4 // 缓冲数组长度为4
- // extern bit uart2_receive_flag; // 串口1接收完成标志
- // extern u8 TX2_Cnt; //发送计数
- // extern u8 RX2_Cnt; //接收计数
- // extern bit B_TX2_Busy; //发送忙标志
- // extern u8 RX2_Buffer[UART2_BUF_LENGTH]; // 接收缓冲
- extern u8 B_Tx_Finish;
- extern u8 B_Rx_Finish;
- extern u8 B_Rx_Data_ING; // 接收数据标志位 , < 1:接收数据中,0:未接收到数据 >
- extern u8 B_Read_Error; // UART读取出据校验和出错,< 1:数据读错,0:数据读取正确 >
- extern u8 u8_TxBuf[10];
- extern u8 u8_RxBuf[10];
- extern u8 u8_TX_Length;
- extern u8 u8_RX_Length;
- extern u8 u8_RX_Index;
- void UART2_Init(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- void UART2SendStr(u8 *puts); // 发送字符串
- void UART2Send(u8 dat); // 发送单个字符
- void Clear_RxBuf(void);
- #endif
复制代码
uart2.c
- #include "uart2.h"
- u8 TX2_Cnt = 0; // 发送计数
- u8 RX2_Cnt = 0; // 接收计数
- bit B_TX2_Busy = 0; // 发送忙标志
- // bit uart2_receive_flag = 0; // 串口2接收完成标志
- // u8 RX2_Buffer[UART2_BUF_LENGTH] = {0xFF}; // 接收缓冲
- /*---------------------------------------------------------*/
- // u8 B_ReadReg_Time_EN; // 串口读取寄存器数据,时间计数器标志位,1--开启计数,0--关闭计数
- u8 B_Tx_Finish = 0;
- u8 B_Rx_Finish = 0;
- u8 B_Rx_Data_ING = 0; // 接收数据标志位 , < 1:接收数据中,0:未接收到数据 >
- u8 B_Read_Error = 0; // UART读取出据校验和出错,< 1:数据读错,0:数据读取正确 >
- u8 u8_TxBuf[10] = {0};
- u8 u8_RxBuf[10] = {0};
- u8 u8_TX_Length = 0;
- u8 u8_RX_Length = 0;
- u8 u8_RX_Index = 0;
- // u8 u8_ReadReg_Index;
- // u8 u8_ReadReg_Time; // 串口读取寄存器数据的时间
- /*==========================================================
- * Function : void Clear_RxBuf(void)
- * Describe : 在准备接收串口数据前,清空接收缓存器的数据
- * Input : none
- * Output : none
- * Return : none
- * Record : 2019/04/03
- ===========================================================*/
- void Clear_RxBuf(void)
- {
- u8 i;
- for (i = 0; i < 10; i++) {
- u8_RxBuf[i] = 0x00;
- }
- B_Rx_Data_ING = 0;
- B_Rx_Finish = 0;
- u8_RX_Index = 0;
- }
- //========================================================================
- // 函数: void UART2_SendStr(u8 *puts)
- // 描述: 串口2发送字符串函数。
- // 参数: puts: 字符串指针.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 备注:
- //========================================================================
- void UART2SendStr(u8 *puts)
- {
- for (; *puts != 0; puts++) // 遇到停止符0结束
- {
- UART2Send(*puts);
- }
- }
- //========================================================================
- // 函数: void UART2_Send(u8 dat)
- // 描述: 串口2发送字符串函数。
- // 参数: dat: 字符.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 备注:
- //========================================================================
- void UART2Send(u8 dat)
- {
- while (B_TX2_Busy);
- B_TX2_Busy = 1;
- S2BUF = dat;
- }
- //========================================================================
- // 函数: SetTimer2Baudraye2(u16 dat)
- // 描述: 设置Timer2做波特率发生器。
- // 参数: dat: Timer2的重装值.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 备注:
- //========================================================================
- void SetTimer2Baudraye2(u16 dat) // 使用Timer2做波特率.
- {
- AUXR &= ~(1 << 4); // Timer stop
- AUXR &= ~(1 << 3); // Timer2 set As Timer
- AUXR |= (1 << 2); // Timer2 set as 1T mode
- T2H = dat / 256;
- T2L = dat % 256;
- IE2 &= ~(1 << 2); // 禁止定时器中断
- AUXR |= (1 << 4); // Timer run enable
- }
- //========================================================================
- // 函数: void UART2_Init(u8 brt)
- // 描述: UART2初始化函数。
- // 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 备注:
- //========================================================================
- void UART2_Init(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
- {
- /*********** 波特率固定使用定时器2 *****************/
- if (brt == 2) {
- SetTimer2Baudraye2(BRT2);
- P_SW2 &= ~0x01;
- P_SW2 |= 0; // UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
- S2CON = 0x90; // 8位数据, 1位起始位, 1位停止位, 1校验,允许接收
- USART2CR2 = 0x04; // 硬件自动产生偶校验位
- // IP2 |= 0x01; //提高串口2中断优先级,防止数据丢失
- IE2 |= 0x01; // 允许中断
- B_TX2_Busy = 0;
- TX2_Cnt = 0;
- RX2_Cnt = 0;
- }
- }
- //========================================================================
- // 函数: void UART2_int (void) interrupt UART2_VECTOR
- // 描述: UART2中断函数。
- // 参数: nine.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2014-11-28
- // 备注:
- //========================================================================
- void UART2_int(void) interrupt 8
- {
- if (S2CON & 1) // 收到数据
- {
- S2CON &= ~1; // Clear Rx flag
- u8_RxBuf[u8_RX_Index] = S2BUF; // 数据接收中
- if (++u8_RX_Index >= u8_RX_Length) {
- u8_RX_Index = 0;
- B_Rx_Finish = 1;
- }
- }
- if (S2CON & 2) // 发送数据
- {
- S2CON &= ~2; // Clear Tx flag
- B_TX2_Busy = 0;
- }
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|