Делаю Bluetooth HID джойстик на микроконтроллере PIC18F4550 и bluetooth модуле Bluegiga WT12. Микроконтроллер с модулем общается через UART на скорости 115200( пробовал так же на скорости 9600 ), эта скорость вшита в модуль производителем. С конфигурацией bluetooth модуля разобрался, компьютер определяет его как HID джойстик, данные тоже передаются, кнопки джойстика работают, но есть одна проблемка при передаче данных. Данные передаются в WT12 микроконтроллером через UART постоянно в цикле. Почему-то возникают тормоза при передаче данных, а именно, если передавать данные без паузы после каждого байта, то данные идут с тормозами, а если добавить паузу после передачи очередного байта, то все нормалек. У меня контролируется буфер UART, контролируется буфер WT12, и все равно эти не понятные тормоза. Такое впечатление, что где-то что-то еще осталось без контроля, и оно типа переполняется и дает ошибки, хотя данные поступают на комп без искажений, проверял спец прогой, которая, показывает входящие HID данные. Программку для контроллера пишу в MikroC. Вот два варианта кода:
Вариант передачи данных через UART в Bluetooth WT12 без паузы, который дает тормоза т.е. я нажимаю кнопку джойстика и через секунду вижу как загорается кнопка в параметрах джойстика, в винде, а так же вижу во входящих данных в программе которая показывает входящие данные HID.
Код
while(1)
{
writebuff[0]=0x9F;
writebuff[1]=0x07;
writebuff[2]=0xA1;
writebuff[3]=x_axis;
writebuff[4]=y_axis;
writebuff[5]=x2_axis;
writebuff[6]=y2_axis;
writebuff[7]=hat;
writebuff[8]=~PORTD;
for(i=0;i<9;i++)
{
while( PIR1.TXIF == 0){}//контроль буфера UART
while(UART1_Tx_Idle() == 0) {}//контроль буфера UART
while( BTM_NRTS_bit == 1){}//контроль буфера WT12
UART1_Write(writebuff[i]);//передача байта в WT12
//Delay_us(100);//без паузы
}
}
{
writebuff[0]=0x9F;
writebuff[1]=0x07;
writebuff[2]=0xA1;
writebuff[3]=x_axis;
writebuff[4]=y_axis;
writebuff[5]=x2_axis;
writebuff[6]=y2_axis;
writebuff[7]=hat;
writebuff[8]=~PORTD;
for(i=0;i<9;i++)
{
while( PIR1.TXIF == 0){}//контроль буфера UART
while(UART1_Tx_Idle() == 0) {}//контроль буфера UART
while( BTM_NRTS_bit == 1){}//контроль буфера WT12
UART1_Write(writebuff[i]);//передача байта в WT12
//Delay_us(100);//без паузы
}
}
Вариант, который работает нормально, но с паузой после очередной передачи данных.
Код
while(1)
{
writebuff[0]=0x9F;
writebuff[1]=0x07;
writebuff[2]=0xA1;
writebuff[3]=x_axis;
writebuff[4]=y_axis;
writebuff[5]=x2_axis;
writebuff[6]=y2_axis;
writebuff[7]=hat;
writebuff[8]=~PORTD;
for(i=0;i<9;i++)
{
while( PIR1.TXIF == 0){} //контроль буфера UART
while(UART1_Tx_Idle() == 0) {} //контроль буфера UART
while( BTM_NRTS_bit == 1){} //контроль буфера WT12
UART1_Write(writebuff[i]); //передача байта в WT12
Delay_us(100);//пауза
}
}
{
writebuff[0]=0x9F;
writebuff[1]=0x07;
writebuff[2]=0xA1;
writebuff[3]=x_axis;
writebuff[4]=y_axis;
writebuff[5]=x2_axis;
writebuff[6]=y2_axis;
writebuff[7]=hat;
writebuff[8]=~PORTD;
for(i=0;i<9;i++)
{
while( PIR1.TXIF == 0){} //контроль буфера UART
while(UART1_Tx_Idle() == 0) {} //контроль буфера UART
while( BTM_NRTS_bit == 1){} //контроль буфера WT12
UART1_Write(writebuff[i]); //передача байта в WT12
Delay_us(100);//пауза
}
}
Подскажите, пожалуйста, в чем может быть дело? Может кто-то работал с WT12 и сталкивался с такой проблемой?