使用putsUSART和putrsUSART vs printf

时间:2015-07-30 11:28:21

标签: printf microchip usart

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

1 个答案:

答案 0 :(得分:0)

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

这可能是一个角色投放问题。您应该使用示波器检查字符是否以相同的速率发送(我不是在谈论波特率,而是在字符之间可能有延迟)。