мне нужно передвать и принимать данные с модуля SIM900
сначала у меня было сделано со "своим" круговыми буферами на прием и передачу
все работало на ура, потом переделал как в примере - работает через пень колоду.
такое ощущение что просто не успевает принять все символы.
В чем может быть проблема, подскажите?
С очередями как в примере freertos
CODE
/**
* Прерывание от USART2
*/
void USART2_IRQHandler(void)
{
char byte;
volatile u32 status;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
status = USART2->SR;
/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART_ReceiveData(USART2);
xQueueSendFromISR(qRxGsmQueue, &byte, &xHigherPriorityTaskWoken);
}
/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
/* Берем байт из очереди */
if (xQueueReceiveFromISR(qTxGsmQueue, &byte, &xHigherPriorityTaskWoken) == pdTRUE) {
/* A character was retrieved from the queue so can be sent to the THR now. */
USART_SendData(USART2, byte);
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
/**
* Прием строки из кольцевого буфера
*/
int gsm_get_str(char *str, int len)
{
int i = 0;
u8 byte;
/* Get the next character from the buffer. Return false if no characters are available, or arrive before xBlockTime expires. */
while (xQueueReceive(qRxGsmQueue, &byte, 0) && i < len) {
str[i++] = byte;
}
str[i] = 0; /* Занулим строку */
return i;
}
Вот это вариант работает
CODE
void USART2_IRQHandler(void)
{
char byte;
volatile u32 status;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
status = USART2->SR;
/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART_ReceiveData(USART2);
// xQueueSendFromISR(qRxGsmQueue, &byte, &xHigherPriorityTaskWoken);
gsm_read_byte_isr(byte);
}
/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
gsm_write_byte_isr();
/* Disable the USART2 Transmit interrupt */
/* USART_ITConfig(USART2, USART_IT_TXE, DISABLE); */
}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
/* Передача строки по-прерываниям - заталкиваем в кольцевой буфер данные */
int gsm_send_buf(u8 * buf, int len)
{
int i = 0;
u8 byte;
/* Пока буфер не заполница */
while (!cb_is_full(&cb_tx) && i < len) {
byte = buf[i++];
cb_write(&cb_tx, &byte);
}
/* Включаем прерывание */
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
return i;
}
/* Передать один байт, когда передавать нечего - выключить передатчик */
void gsm_write_byte_isr(void)
{
volatile u8 byte;
/* Передаем, пока буфер не пустой. Иначе - выключаем прерывания. */
if (!cb_is_empty(&cb_tx)) {
cb_read(&cb_tx, (ElemType *) & byte);
USART_SendData(USART2, byte);
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
/* Прием строки из кольцевого буфера */
int gsm_get_str(char *str, int len)
{
int i = 0;
u8 byte;
while (!cb_is_empty(&cb_rx) && i < len) {
cb_read(&cb_rx, (ElemType *) & byte);
str[i++] = byte;
}
str[i] = 0; /* Занулим строку */
return i;
}
/**
* Обслуживание GPRS модема - прием ответа
* Записываем символ в кольцевой буфер
*/
void gsm_read_byte_isr(u8 rx_byte)
{
cb_write(&cb_rx, &rx_byte);
}
{
char byte;
volatile u32 status;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
status = USART2->SR;
/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART_ReceiveData(USART2);
// xQueueSendFromISR(qRxGsmQueue, &byte, &xHigherPriorityTaskWoken);
gsm_read_byte_isr(byte);
}
/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
gsm_write_byte_isr();
/* Disable the USART2 Transmit interrupt */
/* USART_ITConfig(USART2, USART_IT_TXE, DISABLE); */
}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
/* Передача строки по-прерываниям - заталкиваем в кольцевой буфер данные */
int gsm_send_buf(u8 * buf, int len)
{
int i = 0;
u8 byte;
/* Пока буфер не заполница */
while (!cb_is_full(&cb_tx) && i < len) {
byte = buf[i++];
cb_write(&cb_tx, &byte);
}
/* Включаем прерывание */
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
return i;
}
/* Передать один байт, когда передавать нечего - выключить передатчик */
void gsm_write_byte_isr(void)
{
volatile u8 byte;
/* Передаем, пока буфер не пустой. Иначе - выключаем прерывания. */
if (!cb_is_empty(&cb_tx)) {
cb_read(&cb_tx, (ElemType *) & byte);
USART_SendData(USART2, byte);
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
/* Прием строки из кольцевого буфера */
int gsm_get_str(char *str, int len)
{
int i = 0;
u8 byte;
while (!cb_is_empty(&cb_rx) && i < len) {
cb_read(&cb_rx, (ElemType *) & byte);
str[i++] = byte;
}
str[i] = 0; /* Занулим строку */
return i;
}
/**
* Обслуживание GPRS модема - прием ответа
* Записываем символ в кольцевой буфер
*/
void gsm_read_byte_isr(u8 rx_byte)
{
cb_write(&cb_rx, &rx_byte);
}