【问题标题】:Segmentation violation wiringpi分段违规接线
【发布时间】:2021-02-11 14:27:16
【问题描述】:

我对以下代码有疑问。我认为这是一个指针问题,但我不知道如何解决它。

我想从 main 调用 SIM7070_Start 函数。该函数调用SIM7070_SendCommand,然后出现错误。 和 WiringPi 的 'serial' 变量有关吗?

请帮忙


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>

const int pwr = 4;
const int dtr = 25;

int SIM7070_PowerOn()
{
   printf("SIM7070_PowerOn\n");
   pinMode(pwr, OUTPUT);
   digitalWrite(pwr, HIGH);
   delay(2000);
   digitalWrite(pwr, LOW);
   delay(2000);

   pinMode(dtr, OUTPUT);
   digitalWrite(dtr, LOW);
   delay(1000);

}

int SIM7070_powerDown(void)
{
   printf("SIM7070_PowerDown\n");
   digitalWrite(pwr, HIGH);
   delay(1000);
   digitalWrite(pwr, LOW);
   delay(2000);

}

int SIM7070_SendCommand(int serial, char * command, char * expectedResponse)
{
   char data;
   data = (char *) malloc(sizeof(char));

   printf("\nSEND COMMAND IS: %s\n", command);

   serialPrintf(serial, command);
   delay(200);

   while (serialDataAvail(serial)) {
       data = serialGetchar(serial);
       printf("%s", data);
   }

   if (strlen(expectedResponse) != 0) {
       if (strcmp(data, expectedResponse) <= 0) {
           printf("\nSIM7070_SendCommand - The expected response has been found\n");
           return 1;
       } else {
           printf("\nSIM7070_SendCommand - The expected response hasn't been found\n");
           return 0;
       }
   }
}

void SIM7070_Start(int serial)
{
   SIM7070_SendCommand(serial, "AT\r\n", "OK");
}

int main()
{
   int serial;
   char data;

   if (wiringPiSetup() < 0)
       return 1;
   if ((serial = serialOpen("/dev/ttyS0", 57600)) < 0)
       return 1;

   printf("Serial start ...\n");

   SIM7070_PowerOn();
   delay(2000);

   SIM7070_Start(serial);

   delay(5000);
   serialClose(serial);
   SIM7070_powerDown();

   return 0;
}

如果主要是:

int main()
{
   int serial;
   char data;

   if (wiringPiSetup() < 0)
       return 1;
   if ((serial = serialOpen("/dev/ttyS0", 57600)) < 0)
       return 1;

   printf("Serial start ...\n");

   SIM7070_PowerOn();
   delay(2000);

   SIM7070_SendCommand(serial, "AT\r\n", "OK");

   delay(5000);
   serialClose(serial);
   SIM7070_powerDown();

   return 0;
}

它有效。

【问题讨论】:

  • *data = serialGetchar(serial);char *data 尚未分配值。
  • 你好,保罗,我不明白。我该怎么办?
  • data 必须指向函数SIM7070_SendCommand中的有效内存
  • 为什么是char *data 而不是char data
  • 我想将数据与预期响应进行比较。我编辑帖子以显示它。

标签: c wiringpi


【解决方案1】:

另见我的 cmets。你可能想要一个像这样的循环:

char data[256], *pData= data;
while(serialDataAvail(serial)){ 
   *pData++ = serialGetchar(serial);     
}
*pData= '\0';
printf ("%s", data);

这使用一个字符数组来放置接收到的数据。指针变量pData 然后指向这个缓冲区并随着接收到的每个字符递增。最后,它以终止空字符终止(字符串)缓冲区。

【讨论】:

  • 您可能需要添加检查以避免读取超过 255 个字符
  • 例如int i = 0; for (; i &lt; 255 &amp;&amp; serialDataAvail(serial); i++) { data[i] = serialGetchar(serial); } data[i] = 0;
猜你喜欢
  • 2020-12-24
  • 2017-06-11
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 2011-02-02
  • 2013-11-04
相关资源
最近更新 更多