0

我正在开发一个嵌入式应用程序,它可以通过本地网络将数据发送到 WCF 服务。这是通过让 PIC18F45K50 通过 USART 将数据发送到 RN-171 模块来实现的。该模块连接到本地 AP 并配置为将数据发送到运行 WCF 服务的本地服务器。为了确定我需要发送的确切字符串,我使用 Fiddler 监视从客户端发送到服务的数据,然后我复制了整个消息并从我的微控制器发送。

我的问题:如果我使用 printf 发送确切的包,服务器接受输入并返回 200 OK,我可以找到存储在我的计算机上的测试消息。但是我在尝试使用 putsUART() 时注意到了一个非常奇怪的问题

以下代码有效:

            printf("POST http://grossen-pc:60312/MicroControllerComSvc.svc HTTP/1.1\r\nContent-Type: text/xml;"
                    " charset=utf-8\r\nSOAPAction: \"http://tempuri.org/IMicroControllerComSvc/GetMicrocontrollerData\"\r\nHost: "
                    "192.168.0.104:60312\r\nContent-Length: 245\r\nExpect: 100-continue\r\nAccept-Encoding:"
                    " gzip, deflate\r\nConnection: Keep-Alive\r\n\r\n<s:Envelope xmlns:s="
                    "\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Body><GetMicrocontrollerData xmlns="
                    "\"http://tempuri.org/\"><microControllerData>");
            printf("%d,%02d,%d,%d,%d,%04d,%02d,%03d,%02d,%02d,%d",PackageType,Device,ID,Data1,State,Data2,Data3,Data4,Data5,Data6,Data7);
            printf("</microControllerData></GetMicrocontrollerData></s:Body></s:Envelope>");

如果我将第二个 printf 替换为:

    puts1USART(DataBuffer);

服务器不接受包裹。DataBuffer 是一个 char 数组,包含完全相同的参数,并且长度与我在 printf 指令中使用的字符串完全相同。例如,如果我想将字符串存储在一个常量 rom char 数组中并且我使用 putrsUSART(); 也会发生同样的事情。发送它们。

通过这两种方法发送包时,我使用 TeraTerm 查看包的内容,它们看起来相同。我完全失去了为什么会发生这种情况。

使用 printf 和 putsUSART 发送数据有什么区别?(除了显而易见的)第二个函数可以对服务器不喜欢的字符串发送方式做些什么?

4

1 回答 1

0

我不熟悉 putsUSART/putrsUSART 例程。大概它们是某些特定于实现的库的一部分。

可能是人物节奏问题。您应该使用示波器检查字符是否以相同的速率发送(我不是在谈论波特率,而是在字符之间可能存在延迟)。

于 2015-07-30T21:47:04.030 回答