linux使用socket操作串口等总线

        要使用标准的套接字接口来操作串口,肯定需要将以太网换成串口,即在linux内核中获取到链路层帧数据包,然后使用串口发出去,同理,使用串口接收到数据流后,封装成链路层帧数据包,传回给linux网络协议栈。

        可以轻易实现点对点的通信,但坏处是串口速度慢,同理,可以把串口换成其他通信,譬如i2c、spi、local bus、usb等等你能想到的总线均能作为链路层,他们的速度越来越高,当然了usb的话无需这么做,大把usb网卡,又便宜,何必辛苦自己!!上述只有串口和usb(3.0以上)是全双工总线,最好用,其他的是半双工,需要额外处理中断。

        驱动具体可参考drivers/net/ethernet/microchip/enc28j60.c,它是通过spi进行读写数据。我就是根据它进行修改得到自己的驱动。参考linux内核已有驱动是一个很好的学习方法!!

步骤1:注册网络设备对象
struct net_device* pstNetDev;
pstNetDev = alloc_etherdev(sizeof(struct serial_net));
pstNetDev->if_port = IF_PORT_100BASET;
pstNetDev->netdev_ops = &serial_netdev_ops;
pstNetDev->ethtool_ops = &serial_ethtool_ops;
ret = register_netdev(pstNetDev);
当然了,注册前最好也设置一下随机的mac地址
步骤2:发送函数的设计
发送是由当初注册网络设备对象时早已填充的pstNetDev->netdev_ops的ndo_start_xmit回调函数进行回调处理的
其中ndo_start_xmit回调函数的定义如下:
netdev_tx_t		(*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev);
由此得到sk_buff对象skb,该对象含有链路层PDU和net_device对象pstNetDev,假设serial_send_frame是硬件(串口、spi等)发送接口
netif_stop_queue(pstNetDev);
if(0 == serial_send_frame(&skb->data[0], skb->len))
{
		pstNetDev->stats.tx_packets++;
		pstNetDev->stats.tx_bytes += skb->len;
}
else
{
		pstNetDev->stats.tx_errors++;
}
dev_kfree_skb(skb);
netif_wake_queue(pstNetDev);
return NETDEV_TX_OK;
步骤3:接收
接收是从某总线(如串口、spi等)的中断服务程序中处理:
其中pbyBuffer和wLength是从总线(如串口、spi等)的中断接收到的一个MTU帧!
假设接收到明显错误的包,可以使用错误计数譬如:
    gpstNetDev->stats.rx_errors++;
    gpstNetDev->stats.rx_dropped++;
假设没问题,可类似如下的操作,下面是通用的流程,可见一斑:
struct sk_buff* pstRecvskb = NULL;
pstRecvskb = netdev_alloc_skb(gpstNetDev, wLength + NET_IP_ALIGN);
skb_reserve(pstRecvskb, NET_IP_ALIGN);
memcpy(skb_put(pstRecvskb, wLength), pbyBuffer, wLength);
pstRecvskb->protocol = eth_type_trans(pstRecvskb, gpstNetDev);
gpstNetDev->stats.rx_packets++;
gpstNetDev->stats.rx_bytes += wLength;
sdwRetn = netif_receive_skb(pstRecvskb);
if(sdwRetn == NET_RX_DROP)
{
	printk("netif_receive_skb error!\n");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值