ソケット通信のプログラム(マイコン側)


マイコンのLinuxアプリケーションとWindowsPC間でソケット通信を行うプログラムを作成しました。
マイコン側をサーバー、PC側をクライアントとして実装しています。
CycloneVのARM上で動作させてテストを行いましたが、Raspberry Piでもそのまま使えると思います。

今回はマイコンのサーバー側プログラムを載せたいと思います。
「Transfer_data」という転送データを格納する構造体を使って、送受信各20個ずつのfloatデータをやり取りしています。
44行目の通信で使用するポート番号は任意に設定してください。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


//転送用構造体
typedef struct {
    float prm_pc_to_soc[20];		//PC→SoCへの転送パラメータ
    float prm_soc_to_pc[20];		//SoC→PChへの転送パラメータ
} Transfer_data;


int
main()
{
	int sock0;
	struct sockaddr_in addr;
	struct sockaddr_in client;
	int len;
	int sock;
	int yes = 1;

	
	//パラメータ転送構造体
	Transfer_data td_recv;
	Transfer_data td_send;
	
	//転送テスト用データ
	float send0 = 30;
	float send1 = 444;

	//ソケット作成
	sock0 = socket(AF_INET, SOCK_STREAM, 0);
	
	//ソケット作成エラーチェック
	if(sock0 < 0) {
		perror("socket");
		return -1;
	}
	
	//接続先情報設定
	addr.sin_family = AF_INET;
	addr.sin_port = htons(12345);
	addr.sin_addr.s_addr = INADDR_ANY;
	
	//ソケットのオプション設定
	setsockopt(sock0, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes,  sizeof(yes));
	
	//アドレスとソケットディスクリプタを関連付け
	if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
		perror("bind");
		return -1;
	}
	
	//接続待ちに設定(acceptにて接続要求を受ける)
	if(listen(sock0, 5) != 0) {
		perror("listen");
		return -1;
	}
	
	
	//接続要求待ちループ
	while (1) {
		len = sizeof(client);
		sock = accept(sock0, (struct sockaddr *)&client, &len);
		
		//接続エラー判定
		if (sock < 0) {
			//エラー時はループを抜けて処理を終了
			perror("accept");
			break;
		}
		
		//受信用バッファ用意
		memset(td_recv, 0, sizeof(td_recv));
		
		//データ受信
		recv(sock, (void *)&td_recv, sizeof(td_recv), 0);
		
		//受信したデータを表示
		printf("recv0 = %f\n", td_recv.prm_pc_to_soc[0]);
		printf("recv1 = %f\n", td_recv.prm_pc_to_soc[1]);
		printf("recv2 = %f\n", td_recv.prm_pc_to_soc[2]);
		
		//送信データをセット
		memcpy(&td_send.prm_soc_to_pc[0], &send0, sizeof(float));
		memcpy(&td_send.prm_soc_to_pc[1], &send1, sizeof(float));
		
		//データ送信送信
		send(sock, (char *)&td_send, sizeof(td_send), 0);
		
	}
	
	//ソケットクローズ
	close(sock0);
	
	printf( "Close socket...\n" );
	
	return 0;
}

以上がサーバー側プログラムです。

次回はPC側のCで実装した場合のソースを載せたいと思います。

No Comments

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です