在C语言中,rand()函数可以用来产生随机数,但它是一个伪随机数。它的产生结果是根据一个数,我们可以称它为种子为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统;为了改变这个种子的值,C为此提供了srand()函数,它的原形是void srand( int a)。
rand()会返回一系列随机数值,为0至RAND_MAX之间的随机数值,而RAND_MAX定义在stdlib.h(其值至少为32767),具体要看你定义的变量类型,int整型的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
(1)随机数生成实例
使用rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);3) 根据需要多次调用rand(),从而不间断地得到新的随机数;4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。
下面是0~32767之间的随机数程序:
#include <stdlib.h>
#include <stdio.h>
#include <time.h> //使用当前时钟做种子
void main( void )
{
int i;
srand( (unsigned)time( NULL ) ); //初始化随机数
for( i = 0; i < 10;i++ ) //打印出10个随机数
printf( " %d/n", rand() );
}
(2)产生任意范围内的随机数
产生1~100之间的随机数可以这样写:
main( )
{
int i;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10;i++ )
printf( "%d/n", rand()%100+1);
}
如何产生设定范围内的随机数?由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X; 这样,就可以产生你想要的任何范围内的随机数了。比如产生2到10的随机数,则用rand()%9+2即可。
=================================================================================
对两个长整型数相除,返回类型为ldiv_t,在stdlib.h头文件中定义。
typedef struct
{
long quot;
long rem;
} ldiv_t;
quot存储的是商(quotient),rem 存储的是余数(remainder)。
示例程序如下:
ldiv_t my_ldiv(long num, long denom)
{
ldiv_t r;
r.quot = num / denom;
r.rem = num % denom;
return (r);
}
int main()
{
ldiv_t t;
t = my_ldiv(200,300000000);
printf("Quotient = %d/tRemainder = %d/n",t.quot,t.rem);
system("pause");
return 0;
}
==================================================================================
假设410个数据缓冲区一次20,依次循环发送
void AppWrite(uint8 *pBuffer, uint8 length)
{
uint8 tmp = 0,len = length;
while(true){
// 240 + 240 +10
if(len > 20){
transfer(pBuffer + tmp, 20);
len -= 20;
tmp +=20;
}
else{
transfer(pBuffer + tmp, len);
break;
}
}
}
上述能满足一般的需求,但是如果拆包在组包时有其他数据参杂进来,影响组包,可把每个包在发送时加个Index,组包时根据index组合起来,即可。
#define DataOnce 20
typedef struct
{
uint8 TotalLength; <span style="white-space:pre"> </span>//总的分包数
uint8 CurrentNum;<span style="white-space:pre"> </span>//当前包的index
uint8 datalength;<span style="white-space:pre"> </span>//数据长度,一般是20,最后一个包按真实长度值
uint8 data[DataOnce];<span style="white-space:pre"> </span>//数据
}Data_Format_Package;
void sbpSerialAppWrite(uint8 *pBuffer, uint16 length)
{
uint8 tmp = 0,len = length;
Data_Format_Package ramb ={0,0,0,{0}};
ramb.TotalLength = length/DataOnce+1;
while(1){
if(len > DataOnce){
ramb.CurrentNum++;
ramb.datalength = DataOnce;
memcpy(ramb.data,pBuffer+tmp,DataOnce);
HalUARTWrite (SBP_UART_PORT, (uint8 *)&ramb , sizeof(Data_Format_Package));
len -= DataOnce;
tmp += DataOnce;
memset(ramb.data,0,DataOnce);
}
else{
ramb.CurrentNum++;
ramb.datalength = len;
memcpy(ramb.data,pBuffer+tmp,len);
HalUARTWrite (SBP_UART_PORT, (uint8 *)&ramb , sizeof(Data_Format_Package));
break;
}
}
}
参考原文: http://www.cublog.cn/u/25381/showart_222055.html