0

我有接受“常量字符*”作为参数的方法。但是当我将下面的数组传递给方法“* SendUartMessage(int uartFd, const char dataToSend)**”时,只有前两个十六进制值显示在参数中的方法内。准确地说,因为第三个值为零 0x00,它会阻止其他值在方法内部传递。任何人都可以提供解决方案来传递方法内的所有数组值。

const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
            SendUartMessage(uartFd, updateAllChannelData);

这是方法

static void SendUartMessage(int uartFd, const char* dataToSend)
{
    size_t totalBytesSent = 0;
    size_t totalBytesToSend = strlen(dataToSend);
    int sendIterations = 0;
    close(r1PinFd);
    r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_High);
    while (totalBytesSent < totalBytesToSend) {
        sendIterations++;

        // Send as much of the remaining data as possible
        size_t bytesLeftToSend = totalBytesToSend - totalBytesSent;
        const char* remainingMessageToSend = dataToSend + totalBytesSent;
        ssize_t bytesSent = write(uartFd, remainingMessageToSend, bytesLeftToSend);
        if (bytesSent == -1) {
            Log_Debug("ERROR: Could not write to UART: %s (%d).\n", strerror(errno), errno);
            exitCode = ExitCode_SendMessage_Write;
            return;
        }

        totalBytesSent += (size_t)bytesSent;
    }
    int c, d;

    sleep(5);
    close(r1PinFd);
    r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_Low);

    Log_Debug("Sent %zu bytes over UART in %d calls.\n", totalBytesSent, sendIterations);
}
4

3 回答 3

2

该数组在索引 2 处有一个 0 字节。strlen计算 C 字符串的长度,即一个以空值结尾(以 0 字节结尾)的数组。将数组视为字符串,长度为 2。如果您想知道数组的实际长度,您必须将其作为参数传递:

const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData, sizeof(updateAllChannelData));

static void SendUartMessage(int uartFd, const char* dataToSend, size_t totalBytesToSend)
{
   ...
}
于 2021-05-21T20:23:06.453 回答
0

任何人都可以提供解决方案来传递方法内的所有数组值。

在 C 中,当将数组传递给函数时,首先将数组转换为第一个元素的类型和地址。

const char updateAllChannelData[] = { 
    0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);

SendUartMessage()接收指向 的指针updateAllChannelData[0]而不是数组。


SendUartMessage()知道要使用多少数组,还要传递数组元素计数并重新写入SendUartMessage()以接受计数。

static void SendUartMessage(int uartFd, size_t count, const char* dataToSend);

const char updateAllChannelData[] = { 
    0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
size_t count = sizeof updateAllChannelData / sizeof updateAllChannelData[0];
SendUartMessage(uartFd, count, updateAllChannelData);
于 2021-05-21T21:04:26.227 回答
0

您正在使用strlen不是字符串的字符数组。

C 中的字符串以空值结尾,这意味着值为 0 的字节结束了字符串。您没有字符串,而是一个有效值包括 0 的字节数组。

您需要将数组的大小作为单独的参数传递给函数。

于 2021-05-21T20:22:31.430 回答