uint32_t rx_in =0;
uint32_t rx_out =0;
uint32_t rx_len =512;
uint8_t rx_buf[512];
uint32_t cdcAvailable(void)
{
uint32_t ret;
ret= (rx_in - rx_out) % rx_len;
return ret;
}
rx_len 나머지 연산으로 오버플로우 예방 ( MAX 512까지만 나오도록)
uint32_t cdcWrite(uint8_t * p_data, uint32_t length)
{
uint32_t pre_time;
uint8_t ret;
pre_time = millis();
while(1)
{
ret= CDC_Transmit_FS(p_data, length);
if(ret == USBD_OK)
{
return length;
}
else if( ret == USBD_FAIL)
{
return 0;
}
if(millis()-pre_time >=100)
{
break;
}
}
pre_time 에 현재 시간(HAL_tick) 을넣고 > 초기 시간
if문에 오는 현재 시간 - 초기시간= 동작time
> 타임아웃을 안주면 while문에서 평생 대기함
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
for(int i=0; i<*Len; i++)
{
cdcDataIn(buf[i]);
}
Len 을 포인터 값으로 해서 문자열 길이 수만큼 for문을 돌게함
------------------------------------------------------------------------------------------
while(1)
{
ledToggle(_DEF_LED1);
delay(500);
while 문 안에서 다른 함수랑 겹치지 않게 ledToggle 할때만 딜레이주는법
>>
uint32_t pre_time;
pre_time = millis(); // 초기시간
while(1)
{
if(millis()-pre_time >= 500) // 500m 일때 if문 돌도록
{
pre_time = millis(); // 다음을위해 현재시간으로 초기화노
ledToggle(_DEF_LED1);
}