Александр_926 писал(а):MF+/05-џЃ“~1MP3
Похоже, проблема в том, что модуль выдаёт обрезанное название песни, и не в utf-16 виде, на что рассчитан парсер.Александр_926 писал(а):MF+/STAS-M~1MP3
Набросал небольшой код (из функций в проекте ampcontrol):
Код: Выделить всё
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define SONG_NAME_SIZE 128
#define BT_FLAG_NAME_CHANGED 0x01
typedef uint8_t BtInput;
enum {
BT_IN_BLUETOOTH = (1 << 0),
BT_IN_USB = (1 << 1),
BT_IN_SDCARD = (1 << 2),
};
typedef struct {
char songName[SONG_NAME_SIZE];
uint16_t flags;
BtInput inMask;
BtInput input;
} BTCtx;
static BTCtx btCtx;
static void utf16To8(char *ustr, char *str, int16_t size)
{
for (int16_t i = 0; i < size; i++) {
uint16_t ucs = (uint16_t)((ustr[2 * i]) | (ustr[2 * i + 1] << 8));
if (ucs <= 0x007F) {
*str++ = 0x00 | (char)((ucs >> 0) & 0x7F);
} else if (ucs <= 0x7FF) {
*str++ = 0xC0 | (char)((ucs >> 6) & 0x1F);
*str++ = 0x80 | (char)((ucs >> 0) & 0x3F);
} else {
*str++ = 0xE0 | (char)((ucs >> 12) & 0x0F);
*str++ = 0x80 | (char)((ucs >> 6) & 0x3F);
*str++ = 0x80 | (char)((ucs >> 0) & 0x3F);
}
}
*str = 0;
}
void bt201ParseSongName(char *line, int16_t size)
{
// Follows "MF+"
char *buffer = btCtx.songName;
utf16To8(line, buffer, size / 2);
// Remove extension
size_t dotPos = strlen(buffer) - 4;
// 3 chars (mp3, wav, wma, aac, ape)
buffer[dotPos] = '\0';
if (buffer[dotPos - 1] == '.') {
// 4 chars (flac)
buffer[dotPos - 1] = '\0';
}
btCtx.flags |= BT_FLAG_NAME_CHANGED;
// Query current mode
//usartSendString(USART_BT, "AT+QM\r\n");
return;
}
int main(void)
{
const char *songName = "/STAS-M~1MP3";
bt201ParseSongName(songName, strlen(songName));
printf("%s\n", btCtx.songName);
return 0;
}
Код: Выделить всё
匯䅔ⵓ繍---
P.S. Попробуйте вместо utf16To8(line, buffer, size / 2); вызвать простое strncpy(btCtx.songName, line, size); - интересно, станут ли эти обрезанные имена, выдаваемые модулем, отображаться на экране.


