configuration of adafruit ultimate gps from raspberry pi does not work - gps
I connected my ultimate gps breakout to my raspberry pi using the USB to TTL serial cable. Using C code I can easily connect to and read NMEA sentences from the GPS. But when I write configuration commands such as PMTK220 to set the update rate, they are ignored. I should get back a PMTK_ACK reporting success or failure, but it is not forthcoming. The problem also occurs when I use terminal windows. ie. I run:
while (true) do cat -A /dev/ttyUSB0 ; done
in one terminal, and get a stream of $GPGGA, $GPGSA, $GPRMC etc messages. In another terminal I run:
echo "$PMTK220,200*2C\r\n" > /dev/ttyUSB0
The NMEA messages continue but there is no PMTK001 coming back. Any ideas?
Ok, here's some code (inspired by gpsd source) that demonstrates sending a configuration message and getting an acknowledgement:
#define _BSD_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
#include <semaphore.h>
#include <string.h>
#ifndef CRTSCTS
# ifdef CNEW_RTSCTS
# define CRTSCTS CNEW_RTSCTS
# else
# define CRTSCTS 0
# endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */
int main (int argc, char **argv) {
int const baudr = B9600, mode = O_RDWR | O_NONBLOCK | O_NOCTTY;
int const fd = open("/dev/ttyUSB0", mode);
assert (fd != -1);
ioctl(fd, (unsigned long)TIOCEXCL);
struct termios ttyOld, ttyNew;
assert(tcgetattr(fd, &ttyOld) != -1);
ttyNew = ttyOld;
ttyNew.c_cflag &= ~(CSIZE | PARENB | PARODD | CRTSCTS | CSTOPB);
ttyNew.c_cflag |= CREAD | CLOCAL | CS8;
ttyNew.c_iflag = ttyNew.c_oflag = 0;
ttyNew.c_lflag = ICANON;
cfsetispeed(&ttyNew, baudr);
cfsetospeed(&ttyNew, baudr);
assert(tcsetattr(fd, TCSANOW, &ttyNew) != -1);
tcflush(fd, TCIOFLUSH);
usleep(200000);
tcflush(fd, TCIOFLUSH);
int const oldfl = fcntl(fd, F_GETFL);
assert (oldfl != -1);
fcntl(fd, F_SETFL, oldfl & ~O_NONBLOCK);
tcdrain(fd);
printf("port opened baudr=%d mode=%d i=%d o=%d c=%d l=%d fl=%d\n", baudr, mode, ttyNew.c_iflag, ttyNew.c_oflag, ttyNew.c_cflag, ttyNew.c_lflag, oldfl);
unsigned char buf[2048];
int count = 0;
while(++count < 20) {
if (count == 4) {
char const *const cmd = "$PMTK220,200*2C\r\n";
int const n = strlen(cmd);
assert(write(fd, cmd, n) == n);
tcdrain(fd);
printf("wrote command %d: %s\n", n, cmd);
}
int const n = read(fd, buf, sizeof(buf));
buf[(n >= sizeof(buf)) ? (sizeof(buf) - 1) : n] = 0;
printf(buf);
}
tcsetattr(fd, TCSANOW, &ttyOld);
close(fd);
}
with results:
pi#pi01 ~/c $ ./test
port opened baudr=13 mode=2306 i=0 o=0 c=3261 l=2 fl=2050
$GPGGA,175748.089,,,,,0,00,,,M,,M,,*71
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175748.089,V,,,,,0.00,0.00,260715,,,N*43
wrote command 17: $PMTK220,200*2C
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$PMTK001,220,2*31
$GPGGA,175749.089,,,,,0,00,,,M,,M,,*70
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,01,11,,,31*7A
$GPRMC,175749.089,V,,,,,0.00,0.00,260715,,,N*42
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175750.089,,,,,0,00,,,M,,M,,*78
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175750.089,V,,,,,0.00,0.00,260715,,,N*4A
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175751.089,,,,,0,00,,,M,,M,,*79
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,175751.089,V,,,,,0.00,0.00,260715,,,N*4B
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,175752.089,,,,,0,00,,,M,,M,,*7A
pi#pi01 ~/c $
Related
How can I modify my code to read from a file input in client and then communicate it to a server?
Code: //server.c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <WinSock2.h> #include <Windows.h> #define SCK_VERSION 0x0202 int main() { //declare sockets first SOCKET ConSock; // used for connection, hence the name SOCKET ListenSock; // used for listening from the server SOCKADDR_IN address; //socket address int addrsize = sizeof(address); long ok; char MESSAGE[200]; char reply[200]; WSADATA WSD; WORD DllVersion; DllVersion = MAKEWORD(2,1); ok = WSAStartup(DllVersion, &WSD); //start creating our sockets ConSock = socket(AF_INET, SOCK_STREAM, NULL); address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_family = AF_INET; address.sin_port = htons(10103); ListenSock = socket(AF_INET, SOCK_STREAM, NULL); bind(ListenSock, (SOCKADDR*)&address, sizeof(address)); listen(ListenSock, SOMAXCONN); printf("Server waiting for connections\n\n"); for(;;){ if (ConSock = accept(ListenSock, (SOCKADDR*)&address, &addrsize)) { ok = recv(ConSock, MESSAGE, sizeof(MESSAGE),NULL); printf("\nClient says:\t %s", MESSAGE); printf("\nEnter reply:\t"); gets(reply); ok = send(ConSock,reply,200,NULL); } } } //client.c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <WinSock2.h> #include <Windows.h> #define SCK_VERSION 0x0202 int main() { SOCKET sock; SOCKADDR_IN address; long ok; char MESSAGE[200]; char reply[200]; WSADATA WSD; WORD DllVersion; DllVersion = MAKEWORD(2,1); ok = WSAStartup(DllVersion, &WSD); address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_family = AF_INET; address.sin_port = htons(10103); for(;;) { sock = socket(AF_INET,SOCK_STREAM,NULL); connect(sock, (SOCKADDR*)&address, sizeof(address)); printf("\nEnter Message:\t"); gets(MESSAGE); ok = send(sock,MESSAGE,200,NULL); ok = recv(sock,reply,sizeof(reply),NULL); printf("\nServer says:\t %s",reply); } } //makefile server: g++ server.c -o server client: g++ client.c -o client clean: rm server rm client all: server client This runs with -lwsock32 and it does a good job, but I need to adjust it now to comunicate some data from a file, the data is mostly values of voltages, currents, active reactive power, etc. I have been trying for quite some time and I cannot seem to adjust it. If you can rewrite it in terms of the client communicating the values(that are stored in a file) to the server, that will be great. Any help is greatly appreciated, as I am not being succesful currently.
How to lower CPU usage of finish_task_switch(), called by epoll_wait?
I've written a simple epoll-driven server to bench network/io performance. The server simply receive a request and send a response immediately. It is slower than redis-server 'get', 38k/s vs 40k/s. Both use redis-benchmark as the load runner, and both used cpu up (>99%). bench redis-server: redis-benchmark -n 1000000 -c 20 -t get -p 6379 bench myserver : redis-benchmark -n 1000000 -c 20 -t get -p 6399 I've profiled them using linux perf, eliminated epoll_ctl in myserver (as what redis-server does). Now the problems is function finish_task_switch() takes too much cpu time, about 10%-15% (for redis-server and redis-benchmark are 3%, on the same machine). The call flow (read it top-down) is -> epoll_wait(25%) -> entry_SYSCALL_64_after_hwframe(23.56%) -> do_syscall_64(23.23%) -> sys_epoll_wait(22.36%) -> ep_poll(21.88%) -> schedule_hrtimeout_range(12.98%) -> schedule_hrtimeout_range_clock(12.74%) -> schedule(11.30%) -> _schedule(11.30%) -> finish_task_switch(10.82%) I've tried writing the server using raw epoll api, and using redis's api in redis/src/ae.c, nothing changed. I've examined how redis-server and redis-benchmark use epoll, no tricks found. The redis CFLAGS is used for myserver, same as redis-benchmark. The CPU usage has nothing to do with level/edge-triggered, block or nonblock client fd, whether epoll_wait's timeout set or not. #include <sys/epoll.h> #include <sys/socket.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> // exit #include <string.h> // memset #include "anet.h" #define MAX_EVENTS 32 typedef struct { int fd; char querybuf[256]; } client; client *clients; char err[256]; #define RESPONSE_REDIS "$128\r\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n" static int do_use_fd(client *c) { int n = read(c->fd, c->querybuf, sizeof(c->querybuf)); if (n == 0) { printf("Client Closed\n"); return n; } n = write(c->fd, RESPONSE_REDIS, sizeof(RESPONSE_REDIS)-1); return n; } int main() { struct epoll_event ev, events[MAX_EVENTS]; int listen_sock, conn_sock, nfds, epollfd; epollfd = epoll_create(MAX_EVENTS); listen_sock = anetTcpServer(err, 6399, NULL, MAX_EVENTS); ev.events = EPOLLIN; ev.data.fd = listen_sock; epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev); clients = (client *)malloc(sizeof(client) * MAX_EVENTS); memset(clients, 0, sizeof(client) * MAX_EVENTS); for (;;) { int n; struct sockaddr addr; socklen_t addrlen = sizeof(addr); nfds = epoll_wait(epollfd, events, MAX_EVENTS, 100); for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listen_sock) { conn_sock = accept(listen_sock, (struct sockaddr *) &addr, &addrlen); anetNonBlock(err, conn_sock); ev.events = EPOLLIN; //ev.events = EPOLLIN | EPOLLET; ev.data.fd = conn_sock; epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,&ev); clients[conn_sock].fd = conn_sock; } else { client *c = &clients[events[n].data.fd]; int ret = do_use_fd(c); if (ret == 0) { epoll_ctl(epollfd, EPOLL_CTL_DEL, c->fd, &ev); } } } } }
Server's listen fd is blocked. set it nonblocked lowers the usage of finish_task_switch to <2%.
Read status of FT245RL pins
Sorry for my ignorance but I am very new in FTDI chip Linux software development. I have module based on FT245RL chip, programmed to be 4 port output (relays) and 4 port opto isolated input unit. I found out in Internet program in C to turn on/off relays connected to outputs D0 to D3. After compiling it works properly. Below draft of this working program: /* switch4.c * # gcc -o switch4 switch4.c -L. -lftd2xx -Wl,-rpath,/usr/local/lib * Usage * # switch4 [0-15], for example # switch4 1 * */ #include <stdio.h> #include <stdlib.h> #include "./ftd2xx.h" int main(int argc, char *argv[]) { FT_STATUS ftStatus; FT_HANDLE ftHandle0; int parametr; LPVOID pkod; DWORD nBufferSize = 0x0001; DWORD dwBytesWritten; if(argc > 1) { sscanf(argv[1], "%d", ¶metr); } else { parametr = 0; } FT_SetVIDPID(0x5555,0x0001); // id from lsusb FT_Open(0,&ftHandle0); FT_SetBitMode(ftHandle0,15,1); pkod=¶metr; ftStatus = FT_Write(ftHandle0,pkod,nBufferSize,&dwBytesWritten); ftStatus = FT_Close(ftHandle0); } My question is. How can I read in the same program, status of D4 to D7 pins, programmed as inputs? I mean about "printf" to stdout the number representing status (zero or one) of input pins (or all input/output pins). Can anybody help newbie ? UPDATE-1 This is my program with FT_GetBitMode // # gcc -o read5 read5.c -L. -lftd2xx -Wl,-rpath,/usr/local/lib #include <stdio.h> #include <stdlib.h> #include "./ftd2xx.h" int main(int argc, char *argv[]) { FT_STATUS ftStatus; FT_HANDLE ftHandle0; UCHAR BitMode; FT_SetVIDPID(0x5555,0x0001); // id from lsusb ftStatus = FT_Open(0,&ftHandle0); if(ftStatus != FT_OK) { printf("FT_Open failed"); return; } FT_SetBitMode(ftHandle0,15,1); ftStatus = FT_GetBitMode(ftHandle0, &BitMode); if (ftStatus == FT_OK) { printf("BitMode contains - %d",BitMode); } else { printf("FT_GetBitMode FAILED!"); } ftStatus = FT_Close(ftHandle0); } But it returns "FT_GetBitMode FAILED!" instead value of BitMode
FT_GetBitMode returns the instantaneous value of the pins. A single byte will be returned containing the current values of the pins, both those which are inputs and those which are outputs. Source.
Finally I found out whats going wrong. I used incorrect version of ftdi library. The correct version dedicated for x86_64 platform is located here: Link to FTDI library
how to perform ssdp communicationbetween upnp devices
i am trying to implement the upnp level communication between the devices .. but facing problem in getting the response message .and more over on sending the ssdp:discovery multicast not able to recieve the messages from the devices ... please guide me through i am completely newto this topic pre-requisite done by me : 1.able to send the M-Search ..and notify message on the network .. and have confirmed via wireshark 2.gone through the upnp architecture related pdf response got in wireshark : when ever i am sending the message i am getting the icmp error message that destination is not reachable .. < client side code > is the first one and second one is the for time being i am just sending up the data on local host #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define SRV_IP "127.0.0.1" /* diep(), #includes and #defines like in the server */ #define BUFLEN 512 #define NPACK 10 #define PORT 1900 void diep(char *s) { perror(s); exit(1); } int main(void) { struct sockaddr_in si_other; int s, i, slen=sizeof(si_other); char buf[BUFLEN]; if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) diep("socket"); memset((char *) &si_other, 0, sizeof(si_other)); si_other.sin_family = AF_INET; si_other.sin_port = htons(PORT); if (inet_aton(SRV_IP, &si_other.sin_addr)==0) { fprintf(stderr, "inet_aton() failed\n"); exit(1); } for (i=0; i<NPACK; i++) { printf("Sending packet %d\n", i); sprintf(buf, "\n"); if (sendto(s, buf, BUFLEN, 0, &si_other, slen)==-1) diep("sendto()"); } close(s); return 0; } #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #define BUFLEN 512 #define NPACK 10 #define PORT 1900 void diep(char *s) { perror(s); exit(1); } int main(void) { struct sockaddr_in si_me, si_other; int s, i, slen=sizeof(si_other); char buf[BUFLEN]; if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) diep("socket"); memset((char *) &si_me, 0, sizeof(si_me)); si_me.sin_family = AF_INET; si_me.sin_port = htons(PORT); si_me.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(s, &si_me, sizeof(si_me))==-1) diep("bind"); for (i=0; i<NPACK; i++) { if (recvfrom(s, buf, BUFLEN, 0, &si_other, &slen)==-1) diep("recvfrom()"); printf("Received packet from %s:%d\nData: %s\n\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), buf); } close(s); return 0; }
The individual lines in you M-SEARCH need to have "\r\n" at the end of each line, not just a "\n". Your system may just be sending "\n" across the wire. Check the bytes you're sending for a 13 followed by a 10. That's "\r\n".
Handle GPIO in User Space ARM9 Embedded Linux AM1808
I have to interface my GSM module with the AM1808 based on ARM9. I have assigned all the GPIO pins to the Da850.c as well as mux.h files. I successfully created a uImage and inserted that image in my flash. I need to handle some of that GPIO from User application. I know that we can handle the GPIO from the Kerel space but i need to handle from the user space. As for example I have assigned a GPIO for power key to GSM module. I need to change the pin means (HIGH or LOW) through application. Ok i have written a following code to access it from the User Space, #include <stdio.h> #include <time.h> #include <signal.h> #include <fcntl.h> #include <sys/mman.h> #include <stdlib.h> #include <unistd.h> #include "GSMpwr.h" #define BS_GSM_PWR_REGISTER 0x01E26014 #define BS_DCDS_MASK 0x00000004 int fd; // Memory device descriptor unsigned long *pPWR; unsigned short GetGSMpwr(void) { #if defined __HOST_ARM unsigned long dcd_value = *pPWR; return (pwr_value >> 7) & 0x01; #endif } void InitializeGSMpwr(void) { #if defined __HOST_ARM int page_size = getpagesize(); unsigned int MAP_addr; unsigned int reg_addr; unsigned char *pTemp; // Pointer to GSMpwr register /* * Open memory and get pointer to GSMpwr register in the FPGA */ if((fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) { printf("failed to open /dev/mem"); return; } else { MAP_addr = (BS_GSM_PWR_REGISTER & ~(page_size - 1)); pTemp = (unsigned char *)mmap(NULL, page_size,(PROT_READ | PROT_WRITE),MAP_SHARED,fd,MAP_addr); if((pTemp == MAP_FAILED) || (pTemp == NULL)) { printf("failed to map /dev/mem"); return; } else { printf(“Memory Mapped at Address %p. \n”,pTemp); } virt_addr = map_base + (control & MAP_MASK); reg_addr = (BS_GSM_PWR_REGISTER & (page_size - 1)); pPWR = (unsigned long*)(pTemp + reg_addr); printf("GSM PWR PIN mapped in Application\n"); } I can only read that pin through this code, Now i want to use that pin as an output and want to go high and low with the time interval of 3sec.
The easiest way is to utilize GPIO support in sysfs, where you could control all the exported GPIO's. Please have a look at the Linux kernel GPIO documentation, in particular, Sysfs Interface for Userspace part. After you have enabled GPIO support in sysfs (GPIO_SYSFS), the GPIO control would be as easy as: Example GPIO=22 cd /sys/class/gpio ls echo $GPIO > /sys/class/gpio/export ls Notice on the first ls that gpio22 doesn't exist, but does after you export GPIO 22 to user space. cd /sys/class/gpio/gpio$GPIO ls There are files to set the direction and retrieve the current value. echo "in" > direction cat value You can configure the GPIO for output and set the value as well. echo "out" > direction echo 1 > value Example is taken from here.
I got it please find following code for that,I got the Specific pin address and i have accessed that pin like, unsigned short GetGSMpwr(void) { unsigned long pwr_value = *pPWR; printf("GSM_PWR:check Start : %ld",pwr_value); return (pwr_value >> 1) & 0x01; } unsigned short SetGSMpwr(void) { unsigned long pwr_value = *pPWR; printf("GSM_PWR:check Start : %ld",pwr_value); *pPWR = ~((pwr_value >> 1) & 0x01); } unsigned short ClrGSMpwr(void) { unsigned long pwr_value = *pPWR; printf("GSM_PWR:check Start : %ld",pwr_value); *pPWR = 256; }`