/* TK0040A/LCDへの表示文字出力サンプルプログラム */ /* LCD表示16×2、20×4共通 */ /* 20×4→メッセージ1の20文字目以降LCDの3行目に表示*/ /* 20×4→メッセージ2の20文字目以降LCDの4行目に表示*/ /* 履歴 */ /* 2011/06/23 : NULLCLEARの追加 */ #include main(argc,argv) int argc; char *argv[]; { int sockid; struct sockaddr_in sndaddr,rcvaddr; int k; char lcdtext1[1024],lcdtext2[1024]; /*KARACRIXライブラリの初期設定*/ kcxinit( argc, argv ); /*TK0040A通信の初期化*/ karacrix_cominit( &sockid,&sndaddr,&rcvaddr ); k = 0; /*サンプル用データカウンタ値格納変数*/ while( 1 ){ /*1.メッセージ1の文字列作成*/ sprintf( lcdtext1, "AAAA%09d#%!", k++ ); /*2.メッセージ2の文字列作成*/ sprintf( lcdtext2, "BBBB%09d$()", k++ ); /*3.メッセージ送信*/ karacrix_TK0040A_command_send( sockid,&sndaddr,&rcvaddr,lcdtext1,lcdtext2 ); kcxtim_tsleep( 300000 ); /*LANが負荷る為100msec以上のウエイト必ず必要*/ } } /*LCDに表示コマンドを送信する*/ karacrix_TK0040A_command_send( sockid,sndaddr,rcvaddr,lcdtext1,lcdtext2 ) int sockid; /* ソケットID */ struct sockaddr_in *sndaddr; /* 送信アドレス */ struct sockaddr_in *rcvaddr; /* 受信アドレス */ char lcdtext1[],lcdtext2[]; /* LCD表示文字列 */ { static int seqno = 0; char sndbuff[1024],rcvbuff[1024]; /*1.空文字列の変換処理*/ nullstrings_to_NULLCLEAR( lcdtext1 ); nullstrings_to_NULLCLEAR( lcdtext2 ); /*2.メッセージ1の文字列送信 [フレームID msg1-set ASCII文字列]*/ if( ++seqno > 9999 ) seqno = 1; /*通信シーケンス番号(0-9999)*/ sprintf( sndbuff, "%d msg1-set %s", seqno, lcdtext1 ); karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); /*3.メッセージ2の文字列送信 [フレームID msg2-set ASCII文字列]*/ if( ++seqno > 9999 ) seqno = 1; sprintf( sndbuff, "%d msg2-set %s", seqno, lcdtext2 ); karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); /*4.LCDページ制御コマンド送信 [フレームID lcdpage 表示番号 表示時間]*/ if( ++seqno > 9999 ) seqno = 1; sprintf( sndbuff, "%d lcdpage 100 0", seqno ); /*←コマンドリファレンス参照*/ karacrix_sndrcv_com( sockid, sndaddr, rcvaddr, sndbuff, strlen(sndbuff), rcvbuff, sizeof(rcvbuff) ); } /*このサンプルプログラムでは通信相手のIPアドレス固定(192.168.0.200)*/ karacrix_cominit( sockid,sndaddr,rcvaddr ) int *sockid; /* ソケットID */ struct sockaddr_in *sndaddr; /* 送信アドレス */ struct sockaddr_in *rcvaddr; /* 受信アドレス */ { *sockid = socket( AF_INET, SOCK_DGRAM, 0 ); memset( (void *)sndaddr, 0, sizeof(struct sockaddr_in)); sndaddr->sin_family = AF_INET; sndaddr->sin_port = htons ( 20000 ); /* リモートIOのポート番号*/ sndaddr->sin_addr.s_addr = inet_addr( "192.168.0.200" ); /* ← リモートIOのIPアドレス*/ memset( (void *)rcvaddr, 0, sizeof(struct sockaddr_in)); rcvaddr->sin_family = AF_INET; rcvaddr->sin_addr.s_addr = htonl( INADDR_ANY ); rcvaddr->sin_port = htons( 40000 ); /* ← 二重設定に注意:自分(PC)のポート番号*/ bind( *sockid, (struct sockaddr *)rcvaddr, sizeof(struct sockaddr_in) ); } /* IPデータ送信し応答受けるプログラム(以下興味有る方はBSDソケットライブラリ参照) */ karacrix_sndrcv_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ) int sockid; /* ソケットID */ struct sockaddr *sndaddr; /* 送信アドレス */ struct sockaddr *rcvaddr; /* 受信アドレス */ char sndbuff[]; /* 送信データバッファ */ int sndlen; /* 送信データ長 */ char rcvbuff[]; /* 受信データバッファ */ int rcvlen; /* 受信データバッファ長 */ { int len,retry; char snd_frameidname[1024]; char rcv_frameidname[1024]; sscanf( sndbuff, "%s", snd_frameidname ); for( retry = 0; retry < (5); retry ++ ){ rcv_frameidname[0] = (char)0; rcvbuff [0] = (char)0; len = karacrix_udp_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ); if( len <= 0 ){ sleep( 1 ); continue; } rcvbuff[len] = (char)0; sscanf( rcvbuff, "%s", rcv_frameidname ); if( strcmp( snd_frameidname, rcv_frameidname ) == 0 ){ return len; /*正常終了*/ }else{ sleep( 1 ); continue; } } return (-1); /*失敗終了*/ } karacrix_udp_com( sockid,sndaddr,rcvaddr,sndbuff,sndlen,rcvbuff,rcvlen ) int sockid; struct sockaddr *sndaddr; struct sockaddr *rcvaddr; char sndbuff[]; int sndlen; char rcvbuff[]; int rcvlen; { int i,len,fds,addrlen; fd_set fdset; struct timeval tm; /*受信バッファクリア*/ for(i=0;i<100;i++){ fds = 1 + sockid; FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = tm.tv_usec = (0); if( select( fds,&fdset,(fd_set *)NULL,(fd_set *)NULL,&tm ) <= 0 ){ break; } addrlen = sizeof(struct sockaddr); (void)recvfrom( sockid,(void *)rcvbuff,rcvlen,0,rcvaddr,&addrlen ); } /* 送信チェック */ fds = 1 + sockid; FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = (1); tm.tv_usec = (0); if( select( fds,(fd_set *)NULL,&fdset,(fd_set *)NULL,&tm ) <= 0 ){ //perror("sendto-select"); return 0; } /* データ送信 */ addrlen = sizeof(struct sockaddr); (void)sendto( sockid,(void *)sndbuff,sndlen,0,sndaddr,addrlen ); /* 受信チェック */ FD_ZERO( &fdset ); FD_SET ( sockid, &fdset ); tm.tv_sec = (20); /*要調整(ハング回避:無線LAN介入時等遅延可能性大の場合は30〜60)*/ tm.tv_usec = (0); if( select( fds,&fdset,(fd_set *)NULL,(fd_set *)NULL,&tm ) <= 0 ){ //perror("recvform-select"); return 0; } /* データ受信 */ if(( len = recvfrom( sockid,(void *)rcvbuff,rcvlen,0,rcvaddr,&addrlen )) < 0 ){ //perror("recvfrom-func"); return 0; } return len; /*受信データ長*/ } nullstrings_to_NULLCLEAR( text ) char text[]; { int i,len; len = strlen( text ); for(i=0;i