用邮箱发送字符和字符串

本文介绍了在UCOS操作系统中如何使用邮箱传递数据,包括字符和字符串。通过void *类型转换,可以传递不同类型的变量。同时,文章提到了一个陷阱:当传递0值时,由于邮箱空判断机制,可能导致接收端无法正确识别。文中给出了发送字符和字符串的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 邮箱使用总结 
1. 数据的存放
邮箱一般用来传递数据,不管何种类型都可以传递。在传递时,先把数据数据用 void *进行 类型变化,化为 void *这种万用类型,而在接收邮箱的数据时,再还原成本身的数据类型。 
比如以下的两个例子: 
一是传递指向一个数组的指针。
发端采用如下方式: OSMboxPost(ComSendMbox, (void *)ComBufRec); 
其中的 ComBufRec 就是数组名,也表示指向该数组的指针,将原来的字符型数组名(或指 针)变成(void *)类型,
而接收端,利用 send_ptr = (uint8 *)OSMboxPend(ComSendMbox, 0, &err); 
将(void *)类型还原为指针。
 二是传递一个字符型变量。
发端采用如下方式: OSMboxPost(KeyMbox, (void *)key_value); 其中的 key_value 就是字符型(char)变量,将原来的字符型变量变成(void *)类型,
而接收端,利用 key = (INT8U)OSMboxPend(KeyMbox, 0, &err); 
将(void *)类型还原为字符型变量。 
2、关于在邮箱中不能存放传递 0 值的问题 
在邮箱的传递中,如果把一个 0 值放入邮箱,经过 void *类型变化后,变成了 void *0,而 判断邮箱中是否有数据正是通过判断邮箱中指向 Message 的指针是否为 0 来判断, 这样虽然 放入了一个 0 变量,但邮箱中却无法判断这个 0 值,认为邮箱中还是空。 ucos 觉得使用它还是需要很多技巧性的,也就是说 ucos 需要技巧性的操作

发送字符方式

OS_EVENT *Send_Mbox; // led3 Mbox control led on

Send_Mbox=OSMboxCreate((void *)0) ;//create mail box


void LED3_Task(void *pdata)
{
INT8U err;
char txmsg='A';
while (1)
{
OSMboxPost(Send_Mbox,(void *)&txmsg);//task3 send mbox to task4   Send_Mbox

Uart_Printf("\nIN LED3_Task Run --333");
Uart_Printf("\n");
LED3_off();
LED4_off();
if(txmsg=='Z')
txmsg='A';
txmsg++;
OSTimeDly(OS_TICKS_PER_SEC*3);
}
}

void LED4_Task(void *pdata)
{
INT8U err;
char *rxmsg="initial string ";
while (1)
{
rxmsg=(char *)OSMboxPend(Send_Mbox,0,&err); //

     Uart_Printf("\n IN LED4 Run receice--44444");
Uart_Printf(rxmsg);
Uart_Printf("\n");
LED4_on();
LED3_on();
OSTimeDly(OS_TICKS_PER_SEC*6);
}
}

发送字符串方式
void LED3_Task(void *pdata)
{
INT8U err;
char *txmsg="send hello ";//='a';
while (1)
{
OSMboxPost(Send_Mbox,(void *)txmsg);//task3 send mbox to task4   Send_Mbox
Uart_Printf("\nIN LED3_Task Run --333");
Uart_Printf("\n");
LED3_off();
LED4_off();
OSTimeDly(OS_TICKS_PER_SEC*6);
}
}

void LED4_Task(void *pdata)
{
INT8U err;
char *rxmsg="initial string ";
while (1)
{
//Uart_Printf("\nEnter LED4_Task run \n");
rxmsg=(char *)OSMboxPend(Send_Mbox,0,&err); //
Uart_Printf("\n IN LED4 Run receice--444");
Uart_Printf(rxmsg);
Uart_Printf("\n");
LED4_on();
LED3_on();
OSTimeDly(OS_TICKS_PER_SEC*10);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值