宏BUF_SIZE_BYTES(buf)和BUF_SIZE_CHARS(buf)计算数组最大容纳字节数和字符数

本文介绍了一种使用预处理宏定义来计算缓冲区的字节数和字符数的方法,并通过一个示例展示了如何应用这些宏定义。
//calculate the number of bytes of the max size
#define BUF_SIZE_BYTES(buf)	(sizeof(buf)-sizeof(buf[0]))

//calculate the number of characters of the max size
#define BUF_SIZE_CHARS(buf)	(sizeof(buf)/sizeof(buf[0]) -sizeof(buf[0]))	

int _tmain(int argc, _TCHAR* argv[])
{
	
	TCHAR aa[12] = TEXT("");
	printf("BUF_SIZE_BYTES(aa)=%d\n",BUF_SIZE_BYTES(aa));
	printf("BUF_SIZE_CHARS(aa)=%d\n",BUF_SIZE_CHARS(aa));

	getchar();
	return 0;
}


 

整理并合并 #include <stdio.h> #include <string.h> #include <assert.h> // 模拟串口发送缓冲区 #define TX_BUFFER_SIZE 256 unsigned char uart_tx_buffer[TX_BUFFER_SIZE]; unsigned int tx_buffer_index = 0; unsigned int tx_byte_count = 0; // 模拟发送数据记录 typedef struct { unsigned char data[TX_BUFFER_SIZE]; unsigned int count; unsigned int sequence[TX_BUFFER_SIZE]; unsigned int sequence_count; } uart_transmit_log_t; uart_transmit_log_t transmit_log; // 模拟的MCU串口发送函数 void Uart_PutChar(unsigned char value) { printf("[UART发送] 字节: 0x%02X ('%c')\\n", value, (value >= 32 && value <= 126) ? value : '.'); tx_byte_count++; } // 需要测试的目标函数 void uart_transmit_output(unsigned char value) { // 实际使用时需要替换为具体的MCU串口发送函数 extern void Uart_PutChar(unsigned char value); Uart_PutChar(value); // 串口发送函数 // 记录发送数据用于测试验证 if (tx_buffer_index < TX_BUFFER_SIZE) { uart_tx_buffer[tx_buffer_index++] = value; transmit_log.data[transmit_log.count++] = value; transmit_log.sequence[transmit_log.sequence_count++] = tx_byte_count; } } // 测试辅助函数 void reset_test_environment(void) { memset(uart_tx_buffer, 0, TX_BUFFER_SIZE); memset(&transmit_log, 0, sizeof(transmit_log)); tx_buffer_index = 0; tx_byte_count = 0; } void print_hex_data(const unsigned char *data, unsigned int len) { printf("十六进制数据: "); for (unsigned int i = 0; i < len; i++) { printf("%02X ", data[i]); } printf("\\n"); } void print_ascii_data(const unsigned char *data, unsigned int len) { printf("ASCII数据: "); for (unsigned int i = 0; i < len; i++) { if (data[i] >= 32 && data[i] <= 126) { printf("%c", data[i]); } else { printf("."); } } printf("\\n"); } // 测试用例 void test_single_byte_transmission(void) { printf("=== 测试1: 单字节发送 ===\\n"); reset_test_environment(); unsigned char test_byte = 0x55; uart_transmit_output(test_byte); assert(uart_tx_buffer[0] == test_byte); assert(transmit_log.count == 1); assert(transmit_log.data[0] == test_byte); assert(tx_byte_count == 1); printf("✓ 单字节发送测试通过\\n"); printf("发送字节: 0x%02X\\n", test_byte); printf("总发送字节数: %u\\n\\n", tx_byte_count); } void test_multiple_bytes_transmission(void) { printf("=== 测试2: 多字节发送 ===\\n"); reset_test_environment(); unsigned char test_data[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; // "Hello" unsigned int data_len = sizeof(test_data); for (unsigned int i = 0; i < data_len; i++) { uart_transmit_output(test_data[i]); } assert(transmit_log.count == data_len); assert(tx_byte_count == data_len); // 验证发送顺序内容 for (unsigned int i = 0; i < data_len; i++) { assert(uart_tx_buffer[i] == test_data[i]); assert(transmit_log.data[i] == test_data[i]); } printf("✓ 多字节发送测试通过\\n"); print_hex_data(test_data, data_len); print_ascii_data(test_data, data_len); printf("总发送字节数: %u\\n\\n", tx_byte_count); } void test_special_characters_transmission(void) { printf("=== 测试3: 特殊字符发送 ===\\n"); reset_test_environment(); unsigned char special_chars[] = {0x00, 0xFF, 0x0A, 0x0D, 0x7F}; // NULL, 255, LF, CR, DEL unsigned int chars_len = sizeof(special_chars); for (unsigned int i = 0; i < chars_len; i++) { uart_transmit_output(special_chars[i]); } assert(transmit_log.count == chars_len); assert(tx_byte_count == chars_len); printf("✓ 特殊字符发送测试通过\\n"); printf("测试字符: NULL(0x00), 255(0xFF), LF(0x0A), CR(0x0D), DEL(0x7F)\\n"); print_hex_data(special_chars, chars_len); printf("总发送字节数: %u\\n\\n", tx_byte_count); } void test_continuous_transmission(void) { printf("=== 测试4: 连续发送测试 ===\\n"); reset_test_environment(); unsigned int total_bytes = 50; for (unsigned int i = 0; i < total_bytes; i++) { uart_transmit_output(i & 0xFF); } assert(transmit_log.count == total_bytes); assert(tx_byte_count == total_bytes); // 验证发送序列 for (unsigned int i = 0; i < total_bytes; i++) { assert(transmit_log.data[i] == (i & 0xFF)); assert(transmit_log.sequence[i] == i + 1); // 序列号从1开始 } printf("✓ 连续发送测试通过\\n"); printf("连续发送 %u 个字节\\n", total_bytes); printf("总发送字节数: %u\\n\\n", tx_byte_count); } void test_protocol_message_transmission(void) { printf("=== 测试5: 协议消息发送 ===\\n"); reset_test_environment(); // 模拟一个完整的通信协议消息 unsigned char protocol_message[] = { 0xAA, 0x55, // 帧头 0x08, // 数据长度 0x01, 0x02, 0x03, 0x04, // 数据内容 0x05, 0x06, 0x07, 0x08, 0x5A, 0xA5 // 帧尾 }; unsigned int msg_len = sizeof(protocol_message); for (unsigned int i = 0; i < msg_len; i++) { uart_transmit_output(protocol_message[i]); } assert(transmit_log.count == msg_len); assert(tx_byte_count == msg_len); // 验证帧结构 assert(uart_tx_buffer[0] == 0xAA); // 帧头第一部分 assert(uart_tx_buffer[1] == 0x55); // 帧头第二部分 assert(uart_tx_buffer[2] == 0x08); // 数据长度 assert(uart_tx_buffer[msg_len - 2] == 0x5A); // 帧尾第一部分 assert(uart_tx_buffer[msg_len - 1] == 0xA5); // 帧尾第二部分 printf("✓ 协议消息发送测试通过\\n"); printf("协议消息长度: %u 字节\\n", msg_len); print_hex_data(protocol_message, msg_len); printf("总发送字节数: %u\\n\\n", tx_byte_count); } void run_all_tests(void) { printf("串口发送功能测试套件\\n"); printf("======================\\n\\n"); test_single_byte_transmission(); test_multiple_bytes_transmission(); test_special_characters_transmission(); test_continuous_transmission(); test_protocol_message_transmission(); printf("======================\\n"); printf("所有测试用例执行完成!\\n"); printf("总测试用例数: 5\\n"); printf("所有断言检查通过 ✓\\n"); } int main() { run_all_tests(); return 0; } #include <stdio.h> #include <string.h> #include <assert.h> // 测试用缓冲区定义 #define BUFFER_SIZE 128 unsigned char wifi_uart_rx_buf[BUFFER_SIZE]; unsigned char *rx_buf_in = wifi_uart_rx_buf; unsigned char *rx_buf_out = wifi_uart_rx_buf; // 模拟通讯结构 typedef struct { unsigned char Tx[256]; } HAL_UART_TuyaWifiComm_MGR; HAL_UART_TuyaWifiComm_MGR comm_mgr; #define TUYA_FRAME_DATA_START 10 // 函数声明 void uart_receive_input(unsigned char value); void uart_receive_buff_input(unsigned char value[], unsigned short data_len); unsigned short set_wifi_uart_byte(unsigned short dest, unsigned char byte); unsigned short set_wifi_uart_buffer(unsigned short dest, const unsigned char *src, unsigned short len); unsigned char with_data_rxbuff(void); unsigned char take_byte_rxbuff(void); void Buffercopy(unsigned char *dest, const unsigned char *src, unsigned short len); void reset_buffer(void); // 测试函数 void test_uart_receive_single_byte(void); void test_uart_receive_multiple_bytes(void); void test_buffer_wrap_around(void); void test_with_data_check(void); void test_take_byte_function(void); void test_set_wifi_uart_functions(void); void run_all_tests(void); // 重置缓冲区 void reset_buffer(void) { memset(wifi_uart_rx_buf, 0, BUFFER_SIZE); rx_buf_in = wifi_uart_rx_buf; rx_buf_out = wifi_uart_rx_buf; memset(comm_mgr.Tx, 0, sizeof(comm_mgr.Tx)); } void Buffercopy(unsigned char *dest, const unsigned char *src, unsigned short len) { memcpy(dest, src, len); } void uart_receive_input(unsigned char value) { // 计算可用空间 unsigned int used_space; if (rx_buf_in >= rx_buf_out) { used_space = rx_buf_in - rx_buf_out; } else { used_space = (rx_buf_in - wifi_uart_rx_buf) + (BUFFER_SIZE - (rx_buf_out - wifi_uart_rx_buf)); } if (used_space >= BUFFER_SIZE - 1) { printf("[缓冲区满] 丢弃字节: 0x%02X\n", value); return; } // 写入数据 *rx_buf_in++ = value; // 处理缓冲区回绕 if (rx_buf_in >= wifi_uart_rx_buf + BUFFER_SIZE) { rx_buf_in = wifi_uart_rx_buf; } } void uart_receive_buff_input(unsigned char value[], unsigned short data_len) { unsigned short i = 0; for(i = 0; i < data_len; i++) { uart_receive_input(value[i]); } } unsigned short set_wifi_uart_byte(unsigned short dest, unsigned char byte) { unsigned char *obj = (unsigned char *)comm_mgr.Tx + TUYA_FRAME_DATA_START + dest; *obj = byte; dest += 1; return dest; } unsigned short set_wifi_uart_buffer(unsigned short dest, const unsigned char *src, unsigned short len) { unsigned char *obj = (unsigned char *)comm_mgr.Tx + TUYA_FRAME_DATA_START + dest; Buffercopy(obj, src, len); dest += len; return dest; } unsigned char with_data_rxbuff(void) { return (rx_buf_in != rx_buf_out) ? 1 : 0; } unsigned char take_byte_rxbuff(void) { unsigned char value = 0; if(rx_buf_out != rx_buf_in) { value = *rx_buf_out++; // 处理缓冲区回绕 if(rx_buf_out >= wifi_uart_rx_buf + BUFFER_SIZE) { rx_buf_out = wifi_uart_rx_buf; } } return value; } void test_uart_receive_single_byte(void) { printf("测试1: 单字节接收功能\n"); reset_buffer(); uart_receive_input(0x55); assert(with_data_rxbuff() == 1); assert(take_byte_rxbuff() == 0x55); assert(with_data_rxbuff() == 0); printf(" ✓ 单字节接收测试通过\n"); } void test_uart_receive_multiple_bytes(void) { printf("测试2: 多字节接收功能\n"); reset_buffer(); unsigned char test_data[] = {0x01, 0x02, 0x03, 0x04, 0x05}; uart_receive_buff_input(test_data, 5); assert(with_data_rxbuff() == 1); for(int i = 0; i < 5; i++) { assert(take_byte_rxbuff() == test_data[i]); } assert(with_data_rxbuff() == 0); printf(" ✓ 多字节接收测试通过\n"); } void test_buffer_wrap_around(void) { printf("测试3: 缓冲区循环覆盖测试\n"); reset_buffer(); // 填充到缓冲区末尾 for(int i = 0; i < BUFFER_SIZE - 2; i++) { uart_receive_input(i & 0xFF); } // 验证数据读取 for(int i = 0; i < BUFFER_SIZE - 2; i++) { assert(take_byte_rxbuff() == (i & 0xFF)); } // 触发循环写入 uart_receive_input(0xAA); uart_receive_input(0xBB); assert(take_byte_rxbuff() == 0xAA); assert(take_byte_rxbuff() == 0xBB); assert(with_data_rxbuff() == 0); printf(" ✓ 缓冲区循环测试通过\n"); } void test_with_data_check(void) { printf("测试4: 数据存在性检查\n"); reset_buffer(); assert(with_data_rxbuff() == 0); uart_receive_input(0x10); assert(with_data_rxbuff() == 1); take_byte_rxbuff(); assert(with_data_rxbuff() == 0); printf(" ✓ 数据存在性检查测试通过\n"); } void test_take_byte_function(void) { printf("测试5: 字节读取功能\n"); reset_buffer(); uart_receive_input(0x20); uart_receive_input(0x30); assert(take_byte_rxbuff() == 0x20); assert(take_byte_rxbuff() == 0x30); printf(" ✓ 字节读取功能测试通过\n"); } void test_set_wifi_uart_functions(void) { printf("测试6: WiFi UART设置功能\n"); reset_buffer(); // 测试单字节设置 unsigned short pos = set_wifi_uart_byte(0, 0x77); assert(pos == 1); assert(comm_mgr.Tx[TUYA_FRAME_DATA_START] == 0x77); // 测试缓冲区设置 unsigned char test_buf[] = {0x88, 0x99, 0xAA}; pos = set_wifi_uart_buffer(pos, test_buf, 3); assert(pos == 4); assert(comm_mgr.Tx[TUYA_FRAME_DATA_START + 1] == 0x88); assert(comm_mgr.Tx[TUYA_FRAME_DATA_START + 2] == 0x99); assert(comm_mgr.Tx[TUYA_FRAME_DATA_START + 3] == 0xAA); printf(" ✓ WiFi UART设置功能测试通过\n"); } void run_all_tests(void) { test_uart_receive_single_byte(); test_uart_receive_multiple_bytes(); test_buffer_wrap_around(); test_with_data_check(); test_take_byte_function(); test_set_wifi_uart_functions(); } int main() { printf("=== 串口通信功能测试套件 ===\n\n"); run_all_tests(); printf("\n=== 所有测试完成 ===\n"); return 0; }
12-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值