Цитата(Still Enemy @ Sep 30 2015, 09:48)

Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Попробовать можно, но если прочитаете первое сообщение - я дошел до функции USB_WritePacket, в которой идет перезапись из буфера в регистры USB. Так там всё вычитывается правильно, я вижу младшим байтом то, что должна передаться. А реально приходит не тот байт. Уже думал на программу со стороны PC, но потестил древней простой MTTTY.exe из старых примеров VS, много используемой ранее.
Привожу куски, как отправляю:
Если так отправляю, работает
Код
void StartDefaultTask(void const * argument)
{
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 5 */
uint8_t buf_add1[]="-";
uint8_t buf_add2[]="123;";
osDelay(10000);
for(int i=0;1;i++)
{
// Этот код работает ---------------------------------------
while(CDC_Transmit_FS(buf_add1, 1)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2+2, 2)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2+1, 3)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2, 4)!=USBD_OK) osDelay(1);
osDelay(100);
} /* USER CODE END 5 */
}
А если так, не работает - кашу получаю
Код
void StartDefaultTask(void const * argument)
{
/* init code for USB_DEVICE */
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 5 */
uint8_t buf_add1[]="-";
uint8_t buf_add2[]="123;";
osDelay(10000);
for(int i=0;1;i++)
{
// Этот код НЕ работает - передает "кашу"
while(CDC_Transmit_FS(buf_add2, 1)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2+1, 1)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2+2, 1)!=USBD_OK) osDelay(1);
osDelay(100);
while(CDC_Transmit_FS(buf_add2+3, 1)!=USBD_OK) osDelay(1);
osDelay(100);
} /* USER CODE END 5 */
}
По буферам - буфера хоть и локальные, но статичны по сути, т.к. в функции бесконечный цикл задачи ОС.
Цитата(Still Enemy @ Sep 30 2015, 09:48)

Сделайте буфферы глобальными или статическими. За время пока по нескольким прерываниям произойдёт передача данных в стек USB, ваши ЛОКАЛЬНЫЕ данные прога может потереть раз 5. То что, у вас одна последовательность прокатывает, это вам просто повезло - просто этот участок памяти не затёрся.
Если есть возможность - попробуйте у себя передавать данные по 1 байту с паузой, как в моем тестовом примере, будет ли работать и на каком процессоре?
Добавлю: проблемы наблюдаю, если посылки делаю по 1 или 2 байта, 3 байта вроде уходят нормально, возможно сразу не так что-то посмотрел. Я понимаю, что по USB отправлять пакеты по 1-2 байта не есть гуд, но при малых объемах так удобнее, чем собирать данные в пакет и отправлять пакетом...