我正在开发一个嵌入式应用程序,它可以通过本地网络将数据发送到 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 发送数据有什么区别?(除了显而易见的)第二个函数可以对服务器不喜欢的字符串发送方式做些什么?