王天宝 发表于 2025-4-18 09:11:23

8H系列如何做串口校验可调

在使用串口时有时候需要匹配其他设备,如何能做到串口的校验可调,停止位选择1位或者2位

国芯人工智能 发表于 2025-4-18 09:12:00

在使用STC8H系列单片机进行串口通信时,校验位和停止位的配置是确保数据可靠传输的重要参数。以下是如何在STC8H系列中实现串口校验可调以及停止位选择的详细步骤。

1. 串口初始化配置

首先,需要对串口进行初始化配置。STC8H系列单片机通常使用UART模块进行串口通信。以下是一个基本的串口初始化代码示例:

c
void UARTInit(void) {
    SCON = 0x50;      // 8位数据位,1位停止位,无校验位
    PCON |= 0x80;       // 波特率加倍
    TMOD &= 0x0F;       // 清除定时器1模式位
    TMOD |= 0x20;       // 设置定时器1为8位自动重装模式
    TH1 = 0xFD;         // 设置波特率为9600
    TL1 = 0xFD;
    TR1 = 1;            // 启动定时器1
    ES = 1;             // 使能串口中断
    EA = 1;             // 使能全局中断
}

2. 校验位配置

STC8H系列单片机支持多种校验位模式,包括无校验、奇校验和偶校验。校验位的配置通过SCON寄存器的SM0和SM1位来实现。
无校验:SM0 = 0, SM1 = 0
奇校验:SM0 = 1, SM1 = 0
偶校验:SM0 = 1, SM1 = 1

以下是一个根据用户输入配置校验位的示例代码:

c
void UARTSetParity(char parity) {
    switch (parity) {
      case 'N':// 无校验
            SCON &= ~0x30;// SM0 = 0, SM1 = 0
            break;
      case 'O':// 奇校验
            SCON &= ~0x20;// SM0 = 1, SM1 = 0
            SCON |= 0x10;
            break;
      case 'E':// 偶校验
            SCON |= 0x30;   // SM0 = 1, SM1 = 1
            break;
      default:
            // 默认无校验
            SCON &= ~0x30;
            break;
    }
}

3. 停止位配置

STC8H系列单片机支持1位或2位停止位。停止位的配置通过SCON寄存器的SM2位来实现。
1位停止位:SM2 = 0
2位停止位:SM2 = 1

以下是一个根据用户输入配置停止位的示例代码:

c
void UARTSetStopBits(char stopBits) {
    if (stopBits == 2) {
      SCON |= 0x04;// SM2 = 1,2位停止位
    } else {
      SCON &= ~0x04; // SM2 = 0,1位停止位
    }
}

4. 综合应用

在实际应用中,可以根据需要动态调整校验位和停止位。以下是一个综合示例,展示如何根据用户输入配置串口参数:

c
void UARTConfig(char parity, char stopBits) {
    UARTSetParity(parity);
    UARTSetStopBits(stopBits);
}

int main(void) {
    UARTInit();
    UARTConfig('E', 2);// 配置为偶校验,2位停止位

    while (1) {
      // 主循环
    }
}

5. 注意事项
波特率设置:波特率的设置需要根据实际需求进行调整,确保与通信设备一致。
中断处理:如果使用中断方式进行数据接收,需要在中断服务程序中处理接收到的数据。
硬件连接:确保硬件连接正确,包括TX、RX、GND等引脚的连接。

通过以上步骤,您可以在STC8H系列单片机中实现串口校验可调以及停止位的选择,从而满足不同设备的通信需求。

[本文内容由国芯人工智能辅助生成,仅供参考]

国芯人工智能 发表于 2025-4-18 09:12:00

在STC8H系列单片机中,串口通信的校验位和停止位配置是确保数据可靠传输的重要环节。以下是如何实现串口校验可调以及停止位选择的详细步骤和方法。

1. 串口校验位配置
串口通信中的校验位用于检测数据传输过程中是否出现错误。STC8H系列单片机支持多种校验模式,包括无校验、奇校验和偶校验。校验位的配置主要通过设置相关寄存器来实现。

1.1 寄存器配置
STC8H系列单片机的串口配置寄存器通常包括SCON(串口控制寄存器)和PCON(电源控制寄存器)。具体配置步骤如下:
SCON寄存器:用于设置串口的工作模式和校验位。
SM0和SM1位:用于选择串口的工作模式。
SM2位:多机通信控制位。
REN位:接收使能位。
TB8和RB8位:用于校验位的发送和接收。
PCON寄存器:用于设置波特率加倍位和校验位。
SMOD位:波特率加倍位。
SMOD0位:用于选择校验模式。

1.2 校验位设置
通过设置SCON和PCON寄存器,可以实现不同的校验模式:
无校验:将SMOD0位清零,TB8和RB8位不用于校验。
奇校验:将SMOD0位置1,TB8和RB8位用于奇校验。
偶校验:将SMOD0位置1,TB8和RB8位用于偶校验。

2. 停止位配置
停止位用于标识一个数据帧的结束。STC8H系列单片机支持1位和2位停止位。停止位的配置同样通过设置SCON寄存器来实现。

2.1 寄存器配置
SCON寄存器:SM0和SM1位用于选择停止位的长度。
SM0和SM1位设置为00或01时,选择1位停止位。
SM0和SM1位设置为10时,选择2位停止位。

2.2 停止位设置
通过设置SCON寄存器的SM0和SM1位,可以实现不同的停止位长度:
1位停止位:将SM0和SM1位设置为00或01。
2位停止位:将SM0和SM1位设置为10。

3. 实现串口校验可调和停止位选择
在实际应用中,可以通过软件动态调整串口的校验位和停止位。以下是一个示例代码,展示如何实现串口校验可调和停止位选择:

c
include

void UARTInit(unsigned char baudrate, unsigned char parity, unsigned char stopbits) {
    // 设置波特率
    SCON = 0x50; // 8位数据位,1位停止位,无校验
    PCON |= 0x80; // 波特率加倍
    TH1 = baudrate; // 设置波特率
    TL1 = baudrate;
    TR1 = 1; // 启动定时器1

    // 设置校验位
    if (parity == 1) { // 奇校验
      PCON |= 0x40; // 设置SMOD0位
      SCON |= 0x20; // 设置TB8位
    } else if (parity == 2) { // 偶校验
      PCON |= 0x40; // 设置SMOD0位
      SCON &= ~0x20; // 清除TB8位
    } else { // 无校验
      PCON &= ~0x40; // 清除SMOD0位
    }

    // 设置停止位
    if (stopbits == 2) { // 2位停止位
      SCON |= 0x10; // 设置SM0位
    } else { // 1位停止位
      SCON &= ~0x10; // 清除SM0位
    }

    ES = 1; // 使能串口中断
    EA = 1; // 使能全局中断
}

void main() {
    UARTInit(0xFD, 1, 1); // 初始化串口,波特率9600,奇校验,1位停止位
    while (1) {
      // 主循环
    }
}

4. 总结
通过合理配置SCON和PCON寄存器,STC8H系列单片机可以实现串口校验可调和停止位选择。在实际应用中,可以根据具体需求动态调整这些参数,以确保串口通信的可靠性和兼容性。

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-4-18 09:32:58

直接的串口外设通讯还是USB-CDC转串口通讯?

USB-CDC转串口通讯有自适应波特率和串口配置的范例

直接的串口外设通讯,是不是可以自己拟定几条指令切换不同配置。

AI-32位8051 发表于 2025-4-18 10:03:38

【新提醒】USB CDC的波特率是自适应的吗? - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=446&extra=&highlight=%E8%87%AA%E9%80%82%E5%BA%94%E6%B3%A2%E7%89%B9%E7%8E%87&page=1

DebugLab 发表于 2025-4-18 11:22:13

硬件校验(部分型号支持):

//      SCON=0x50;                //设置UART1模式为8位数据可变波特率
//      T2H=BRT>>8;                //设置UART1波特率
//      T2L=BRT;                //设置UART1波特率
//      AUXR|=T2R;                //打开定时器2
//      ES=1;                        //启用UART1中断

      SCON=0xD0;                //设置UART1模式为9位数据可变波特率
      USARTCR2=0x04;      //使能自动校验位,偶校验
      T2H=BRT>>8;                //设置UART1波特率
      T2L=BRT;                //设置UART1波特率
      AUXR|=T2R;                //打开定时器2
      ES=1;                        //启用UART1中断

神农鼎 发表于 2025-4-18 20:20:14

停止位选择1位或者2位

===停止位要2位,那就发送完,加个延时再发送
页: [1]
查看完整版本: 8H系列如何做串口校验可调