c++ - 如何将const char *作为LPCSTR参数的参数传递?

标签 c++ serial-communication playsound

我想使用此函数来调用PlaySoundA函数,但是我要播放的声音文件无法打开。

void AudioClass::playAudio(const char* incomingData, const char* filePath)
{

    char buffer[100]; // <- danger, only storage for 100 characters.
    strncpy_s(buffer, filePath, sizeof(buffer));
    strncat_s(buffer, incomingData, sizeof(buffer));

    PlaySoundA(buffer, NULL, SND_FILENAME);
}

如我所知,如果PlaySoundA()的LPCSTR pszSound参数的参数以字符串形式给出(例如“C:/Users/User/Documents/sound.wav”),即给出了文件的完整路径,声音会播放。

我想将传入数据参数(文件名)和filePath参数结合起来,为此我使用了缓冲区。

如果找不到该文件,则应播放默认的系统声音(在我的情况下是蜂鸣声),但情况不再如此。即使未设置SND_NODEFAULT标志,在这种情况下PlaySoundA()也会以静默方式返回,而不会播放默认的系统声音。

https://docs.microsoft.com/en-us/previous-versions/dd743680(v%3Dvs.85)

我尝试传递的参数是否可能与LPCSTR pszSound参数不兼容?

在运行调试器时,缓冲区变量似乎保留了整个路径(C:/Users/User/Documents/sound.wav \ r \ n),但是为什么末尾有一个\ r \ n前缀呢?

定义:
#define MAX_DATA_LENGTH 255

char incomingData[MAX_DATA_LENGTH];

const char* filePath {"C:/Users/User/Desktop/"};

//Arduino SerialPort object
SerialPort *arduino;

//Audio file AudioClass object
AudioClass* audio;

在这里调用playAudio():
void exampleReceiveData(void)
{
    int readResult = arduino->SerialPort::readSerialPort(incomingData, MAX_DATA_LENGTH);

    audio->AudioClass::playAudio(incomingData, filePath);

    Sleep(10000);
}

EDIT_1:我使用的真实文件路径的长度小于100个字符。

EDIT_2:我收到此警告:字符串'buffer'可能不会以零结尾。

最佳答案

最后的\r\n来自串行端口:https://www.arduino.cc/reference/en/language/functions/communication/serial/println

您可以在复制时跳过以下字符:

    strncat_s(buffer, incomingData, strnlen(incomingData) - 2);

关于c++ - 如何将const char *作为LPCSTR参数的参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61773200/

相关文章:

c++ - 我什么时候应该使用 std::any

c - 使用 C 建立与 RS232 的串行连接

i2c - I2c 总线上的 NACK 和 ACK 响应

c++ - 它说头文件mmsystem.h有问题,我不能使用PlaySound()

c++ - 包括仅当满足 static constexpr 时才编译的代码 C++

c++ - 使用 SFML 和 C++ 将像素打印到屏幕上

c++ - 线程 vector 中的假缓存共享 C++

java - 我想从串行通信中分离数据并将其传递到表中

python-3.x - 在 python3 上播放带有 playsound 的音频时出现问题

c - 简单的声音播放器