OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2588|回复: 2

stm32 RAW-TCP发送模拟量信号,上位机接收为乱码,求大神指导

[复制链接]

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
发表于 2016-9-22 15:25:54 | 显示全部楼层 |阅读模式
5金钱
代码用的是原子精英版RAW-TCP的例程修改的,采集一个通道的模拟量,边采集,边发送,上位机是用C#编写的,通讯调试的时候显示为筹码。求大神指导,下面贴上代码。发送部分的代码,也就是lwIP tcp_poll的回调函数
//lwIP tcp_poll的回调函数
err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
        err_t ret_err;
        struct tcp_client_struct *es;
        es=(struct tcp_client_struct*)arg;
        if(es!=NULL)  //连接处于空闲可以发送数据
        {
                if(tcp_client_flag&(1<<7))        //判断是否有数据要发送
                {
                        int i;
                        for(i=0;i<K;i++)
                        {
                                adcvalude=Get_Adc(ADC_Channel_10);
                                es->p=pbuf_alloc(PBUF_TRANSPORT, sizeof(adcvalude),PBUF_POOL);        //申请内存
                          pbuf_take(es->p,(int*)adcvalude,sizeof(adcvalude));        //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
                          tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去
                        }                               
                        tcp_client_flag&=~(1<<7);        //清除数据发送标志
                        if(es->p)pbuf_free(es->p);        //释放内存
                }else if(es->state==ES_TCPCLIENT_CLOSING)
                {
                        tcp_client_connection_close(tpcb,es);//关闭TCP连接
                }
                ret_err=ERR_OK;
        }else
        {
                tcp_abort(tpcb);//终止连接,删除pcb控制块
                ret_err=ERR_ABRT;
        }
        return ret_err;
}



这个是我上位机C#的接收部分的代码
void TSReceive()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            aimSocket = mySocket.Accept();//服务端监听到的Socket为服务端发送数据的目标socket
            byte[] buffer = new byte[1024];
            while (true)
            {
                try
                {
                    int r = aimSocket.Receive(buffer);//接收到监听的Socket的数据
                    if (r == 0)
                    {
                        MessageBox.Show("连接断开");
                        break;
                    }

                    for (int i = 0; i < buffsize; i++)
                    {
                        //char srdsdf = Encoding.Default.GetChars(buffer, 0, r);
                        string strRec=Encoding.ASCII.GetString(buffer,0,r);
                        string strRec1 = Encoding.Unicode.GetString(buffer, 0, r);
                        string strRec2 = Encoding.UTF8.GetString(buffer, 0, r);
                        string strRec3 = Encoding.Default.GetString(buffer, 0, r);//原代码转换形式                    
                        string ss = aimSocket.RemoteEndPoint.ToString() + ":" + strRec + "\r\n";

                    }

                    int j = 0;
                }
                catch
                { }
            }
        }



求教大神,我该怎么弄,调了很一天多了,试了很多种试,上下位机都改过,还是不行。

最佳答案

查看完整内容[请看2#楼]

你先发送10个字节,比如1~10,然后上位机解析。能实现显示1~10,再去搞你的传输ADC值。 注意编码的不同,导致的数据差异,就可以解决你的问题。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-9-22 15:25:55 | 显示全部楼层
你先发送10个字节,比如1~10,然后上位机解析。能实现显示1~10,再去搞你的传输ADC值。  注意编码的不同,导致的数据差异,就可以解决你的问题。。
回复

使用道具 举报

11

主题

49

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-8-24
在线时间
65 小时
 楼主| 发表于 2016-9-22 15:29:46 | 显示全部楼层
用网络调试助手勾上16进制后就显示有数据,可以看清楚数字,不勾的话,就是乱码了,不知道是什么东东
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 05:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表