新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2016-8-24
- 在线时间
- 65 小时
|
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值。 注意编码的不同,导致的数据差异,就可以解决你的问题。。
|